`

网络字节书序

阅读更多

网络编程,字节序肯定是需要牢记的一个知识点了。

不同的 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模板表.doc"表明这是一份设计独特,采用书序背景和彩色元素的Word文档简历模板。使用这类模板可以提升简历的视觉吸引力,帮助求职者在众多申请者中脱颖而出。 2. **基本信息填写**:简历应...

    android底层学习推荐书序

    大师推荐的android底层学习途径,由于上传有限制,如果有需要的,可以问我要哈

    2019_2020学年高中语文专题五书序第2课伶官传序训练含解析苏教版选修唐宋八大家散文蚜

    综上所述,对于高中语文专题五书序中《伶官传》的学习和训练,不仅是对学生文言文知识的强化,更是对其综合素质的提升。通过对古文词汇、句式、文言翻译和历史人物分析的全面训练,学生们将能够更深入地理解和把握...

    2019_2020学年高中语文专题五书序第3课战国策目录序训练含解析苏教版选修唐宋八大家散文蚜

    这篇资料主要涉及的是高中语文的学习内容,特别是关于古文阅读理解和词汇解析的部分。具体知识点如下: 1. 古代汉语词汇理解: - "不易":在这里解释为“改变”,表示道理的恒久不变。 - "尽同":解释为“完全...

    2019_2020学年高中语文专题五书序第1课张中丞传后叙训练含解析苏教版选修唐宋八大家散文蚜

    在学习唐代著名散文家柳宗元的《张中丞传后叙》时,我们不仅能够领略到古文的魅力,更可以深入了解到唐代的历史文化以及作者的文学造诣。柳宗元作为“唐宋八大家”之一,其作品常被收录于高中语文教材之中,供学生...

    python 读写 Excel 学习总结

    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 的核心概念。Drools 是一个开源的Java决策管理平台,它允许开发者使用规则语言来编写业务逻辑,这些规则可以按特定顺序执行,以处理复杂的业务场景...

    黑龙江省双鸭山市友谊县红兴隆管理局第一高级中学2014届高考语文 考前随堂训练 训练8 简明、连贯、得体,准确、鲜明、生动

    很抱歉,但根据您提供的文件信息,这似乎是一份关于语文考试训练的资料,主要涉及的是语言文字的运用、修改错句、写作启事、拟定专题研究和编写书序等语文能力的练习。这些内容并不属于IT行业的专业知识点。如果您...

    Unity中Android的文件操作

    原数据存放在StreamingAsset中,首次启动复制到persistentDataPath,以后进行更新和读取都在persistentDataPath中使用File进行文件操作。需要恢复书序的时候从StreamingAsset中获取即可。

    郝斌C语言大纲

    郝斌c视频的大纲,上面是郝斌老师的上课书序以及内容

    自动化仪表

    "附录.pdf"和"从书序.pdf"可能包含了参考文献、术语解释以及作者对整个主题的概述或推荐学习路径。 总的来说,这个压缩包提供了关于自动化仪表的全面知识,从基础原理到高级应用,包括传感器技术、控制理论、执行...

    2019_2020学年高中语文第四单元第19课兰亭集序学案含解析粤教版必修220200502130

    1. **文体知识** - 《兰亭集序》是一篇书序,是为《兰亭集》这本诗集所写的前言,介绍了聚会的背景、过程和意义,同时也展现了作者的情感与思考。 2. **作者王羲之** - 王羲之,东晋时期的书法家和文学家,有“书圣...

    甘肃省镇原县镇原中学2020学年高二语文下学期期中试题.doc

    8. **文化交流与学术氛围**:文章描述了扬州当地学者的热情交流,包括讨论经义、询问史事、求书序题辞等活动,展现了地方学术氛围的活跃。 9. **文化传承与变迁**:通过对京师和扬州现状的对比,讨论了文化传承与...

    高一语文兰亭集序随堂练习2[精选].doc

    11. **文段分析**:A选项提到“本语段内容突出了书序的特点”,但实际上,书序通常介绍著述背景、目的等,而此段更多是情感抒发,不完全符合书序的一般特点,因此A选项的表述有误。 通过这个随堂练习,学生可以提升...

    学生成绩管理系统课程设计报告付源代码

    学生成绩管理系统主要对学生的成绩进行管理。系统可以实现对学生成绩、姓名的输入,以及对成绩按书序排序等等。

    《兰亭集序》 (2).ppt

    文体上,《兰亭集序》属于书序,它的功能在于为读者提供作品的背景信息,帮助理解作者的创作意图和作品主题。书序可以分为自序和他序,王羲之的这篇序言则是对一次文人聚会的记录,同时也是对个人情感和人生哲思的...

Global site tag (gtag.js) - Google Analytics