网络编程,字节序肯定是需要牢记的一个知识点了。
不同的 CPU 有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序
最常见的有两种
1 . Little endian :将低序字节存储在起始地址
2 . Big endian :将高序字节存储在起始地址
LE little-endian
最符合人的思维的字节序
地址低位存储值的低位
地址高位存储值的高位
怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说
低位值小,就应该放在内存地址小的地方,也即内存地址低位
反之,高位值就应该放在内存地址大的地方,也即内存地址高位
BE big-endian
最直观的字节序
地址低位存储值的高位
地址高位存储值的低位
为什么说直观,不要考虑对应关系
只需要把内存地址从左到右按照由低到高的顺序写出
把值按照通常的高位到低位的顺序写出
两者对照,一个字节一个字节的填充进去
例子:在内存中双字 0x01020304(DWORD) 的存储方式
内存地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04
例子:如果我们将 0x1234abcd 写入到以 0x0000 开始的内存中,则结果为
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
x86 系列 CPU 都是 little-endian 的字节序 .
网络字节顺序是 TCP/IP 中规定好的一种数据表示格式,它与具体的 CPU 类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用 big endian 排序方式。
为了进行转换 bsd socket 提供了转换的函数 有下面四个
htons 把 unsigned short 类型从主机序转换到网络序
htonl 把 unsigned long 类型从主机序转换到网络序
ntohs 把 unsigned short 类型从网络序转换到主机序
ntohl 把 unsigned long 类型从网络序转换到主机序
在使用 little endian 的系统中 这些函数会把字节序进行转换
在使用 big endian 类型的系统中 这些函数会定义成空宏
同样 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生 bug.
注:
1 、网络与主机字节转换函数 :htons ntohs htonl ntohl (s 就是 short l 是 long h 是 host n 是 network)
2 、不同的 CPU 上运行不同的操作系统,字节序也是不同的,参见下表。
处理器 操作系统 字节排序
Alpha 全部 Little endian
HP-PA NT Little endian
HP-PA UNIX Big endian
Intelx86 全部 Little endian <-----x86 系统是小端字节序系统
Motorola680x() 全部 Big endian
MIPS NT Little endian
MIPS UNIX Big endian
PowerPC NT Little endian
PowerPC 非 NT Big endian <-----PPC 系统是大端字节序系统
RS/6000 UNIX Big endian
SPARC UNIX Big endian
IXP1200 ARM 核心 全部 Little endian
2.
一、字节序定义
字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。
其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。
在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于 TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。比如,以太网头部中2字节的“ 以太网帧类型”,表示后面数据的类型。对于ARP请求或应答的以太网帧类型 来说,在网络传输时,发送的顺序是0x08,0x06。在内存中的映象如下图所示:
栈底 (高地址)
---------------
0x06 -- 低位
0x08 -- 高位
---------------
栈顶 (低地址)
该字段的值为0x0806。按照大端方式存放在内存中。
二、高/低地址与高低字节
首先我们要知道我们C程序映像中内存的空间布局情况:在《C专家编程》中或者《Unix环境高级编程》中有关于内存空间布局情况的说明,大致如下图:
----------------------- 最高内存地址 0xffffffff
| 栈底
.
. 栈
.
栈顶
-----------------------
|
|
\|/
NULL (空洞)
/|\
|
|
-----------------------
堆
-----------------------
未初始化的数据
----------------(统称数据段)
初始化的数据
-----------------------
正文段(代码段)
----------------------- 最低内存地址 0x00000000
以上图为例如果我们在栈上分配一个unsigned char buf[4],那么这个数组变量在栈上是如何布局的呢[注1]?看下图:
栈底 (高地址)
----------
buf[3]
buf[2]
buf[1]
buf[0]
----------
栈顶 (低地址)
现在我们弄清了高低地址,接着来弄清高/低字节,如果我们有一个32位无符号整型0x12345678(呵呵,恰好是把上面的那4个字节buf看成一个整型),那么高位是什么,低位又是什么呢?其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
高低地址和高低字节都弄清了。我们再来回顾一下Big-Endian和Little-Endian的定义,并用图示说明两种字节序:
以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:
Big-Endian: 低地址存放高位,如下图:
栈底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
栈顶 (低地址)
Little-Endian: 低地址存放低位,如下图:
栈底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
---------------
栈顶 (低地址)
在现有的平台上Intel的X86采用的是Little-Endian,而像Sun的SPARC采用的就是Big-Endian。
三、例子
嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。
例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 存放内容
0x4001 0x12
0x4000 0x34
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 存放内容
0x4001 0x34
0x4000 0x12
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 存放内容
0x4003 0x12
0x4002 0x34
0x4001 0x56
0x4000 0x78
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 存放内容
0x4003 0x78
0x4002 0x56
0x4001 0x34
0x4000 0x12
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhaojiangwei102/archive/2009/09/08/4532184.aspx
分享到:
相关推荐
大数据书序 -胡强 胡强/宏源证券总经理 近年来,互联网与传统产业融合进程加速推进,传统产业的运营模式和游戏规则正在被逐步瓦解并再造。苹果、三星颠覆了传统手机终端,亚马逊、阿里巴巴、京东商城改变了传统零售...
"书序背景彩色简历Word模板表.doc"表明这是一份设计独特,采用书序背景和彩色元素的Word文档简历模板。使用这类模板可以提升简历的视觉吸引力,帮助求职者在众多申请者中脱颖而出。 2. **基本信息填写**:简历应...
大师推荐的android底层学习途径,由于上传有限制,如果有需要的,可以问我要哈
综上所述,对于高中语文专题五书序中《伶官传》的学习和训练,不仅是对学生文言文知识的强化,更是对其综合素质的提升。通过对古文词汇、句式、文言翻译和历史人物分析的全面训练,学生们将能够更深入地理解和把握...
这篇资料主要涉及的是高中语文的学习内容,特别是关于古文阅读理解和词汇解析的部分。具体知识点如下: 1. 古代汉语词汇理解: - "不易":在这里解释为“改变”,表示道理的恒久不变。 - "尽同":解释为“完全...
在学习唐代著名散文家柳宗元的《张中丞传后叙》时,我们不仅能够领略到古文的魅力,更可以深入了解到唐代的历史文化以及作者的文学造诣。柳宗元作为“唐宋八大家”之一,其作品常被收录于高中语文教材之中,供学生...
Python 读写 Excel 是在数据分析、自动化报告以及数据管理中常用的一种技能。Excel 文件因其直观易用和强大的数据处理能力而备受青睐,Python 提供了多种库来方便地与 Excel 文件交互,如 `pandas`、`openpyxl`、`...
原书序 1引言 1.1深度学习的定义与背景 1.2本书的结构安排 2深度学习的历史 3三类深度学习网络 3.1三元分类方式 3.2无监督和生成式学习深度网络 3.3监督学习深度网络 3.4混合深度网络 4深度自编码器——一种无监督...
标题 "Drools 规则执行顺序" 涉及的是一个业务规则引擎——Drools 的核心概念。Drools 是一个开源的Java决策管理平台,它允许开发者使用规则语言来编写业务逻辑,这些规则可以按特定顺序执行,以处理复杂的业务场景...
很抱歉,但根据您提供的文件信息,这似乎是一份关于语文考试训练的资料,主要涉及的是语言文字的运用、修改错句、写作启事、拟定专题研究和编写书序等语文能力的练习。这些内容并不属于IT行业的专业知识点。如果您...
原数据存放在StreamingAsset中,首次启动复制到persistentDataPath,以后进行更新和读取都在persistentDataPath中使用File进行文件操作。需要恢复书序的时候从StreamingAsset中获取即可。
郝斌c视频的大纲,上面是郝斌老师的上课书序以及内容
"附录.pdf"和"从书序.pdf"可能包含了参考文献、术语解释以及作者对整个主题的概述或推荐学习路径。 总的来说,这个压缩包提供了关于自动化仪表的全面知识,从基础原理到高级应用,包括传感器技术、控制理论、执行...
1. **文体知识** - 《兰亭集序》是一篇书序,是为《兰亭集》这本诗集所写的前言,介绍了聚会的背景、过程和意义,同时也展现了作者的情感与思考。 2. **作者王羲之** - 王羲之,东晋时期的书法家和文学家,有“书圣...
8. **文化交流与学术氛围**:文章描述了扬州当地学者的热情交流,包括讨论经义、询问史事、求书序题辞等活动,展现了地方学术氛围的活跃。 9. **文化传承与变迁**:通过对京师和扬州现状的对比,讨论了文化传承与...
11. **文段分析**:A选项提到“本语段内容突出了书序的特点”,但实际上,书序通常介绍著述背景、目的等,而此段更多是情感抒发,不完全符合书序的一般特点,因此A选项的表述有误。 通过这个随堂练习,学生可以提升...
学生成绩管理系统主要对学生的成绩进行管理。系统可以实现对学生成绩、姓名的输入,以及对成绩按书序排序等等。
文体上,《兰亭集序》属于书序,它的功能在于为读者提供作品的背景信息,帮助理解作者的创作意图和作品主题。书序可以分为自序和他序,王羲之的这篇序言则是对一次文人聚会的记录,同时也是对个人情感和人生哲思的...