字节序

转载 2012年03月30日 19:36:00

字节序

维基百科,自由的百科全书

字节序,又称端序尾序英语Endianness)。在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。

一般而言,字节序指示了一个UCS-2字符的哪个字节存储在低地址。如果LSByteMSByte的前面,即LSB为低地址,则该字节序是小端序;反之则是大端序。在网络编程中,字节序是一个必须被考虑的因素,因为不同的处理器体系可能采用不同的字节序。在多平台的代码编程中,字节序可能会导致难以察觉的bug

目录

  [隐藏

[编辑]endian词源

endian”一词来源于乔纳森·斯威夫特的小说格列佛游记。小说中,小人国为水煮蛋该从大的一端(Big-End)剥开还是小的一端(Little-End)剥开而争论,争论的双方分别被称为Big-endians和Little-endians。

1980年,Danny Cohen在其著名的论文"On Holy Wars and a Plea for Peace"中,为平息一场关于字节该以什么样的顺序传送的争论,而引用了该词。

[编辑]基本的字节序

对于单一的字节(a byte),大部分处理器以相同的顺序处理位元(bit),因此单字节的存放方法和传输方式一般相同。

对于多字节数据,如整数(32位机中一般占4字节),在不同的处理器的存放方式主要有两种,以内存中0x0A0B0C0D的存放方式为例,分别有以下几种方式:

注: 0x前缀代表十六进制。

[编辑]大端序

大端序(英:big-endian)或称大尾序

Big-Endian.svg
  • 数据以8bit为单位:
地址增长方向  →
... 0x0A 0x0B 0x0C 0x0D ...

示例中,最高有效位(MSB, Most Significant Byte)是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。

  • 数据以16bit为单位:
地址增长方向  →
... 0x0A0B 0x0C0D ...

最高的16bit单元0x0A0B存储在低位。

[编辑]小端序

小端序(英:little-endian)或称小尾序

Little-Endian.svg
  • 数据以8bit为单位:
地址增长方向  →
... 0x0D 0x0C 0x0B 0x0A ...

最低有效位(LSB,Least Significant Byte)是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。

  • 数据以16bit为单位:
地址增长方向  →
... 0x0C0D 0x0A0B ...

最低的16bit单元0x0C0D存储在低位。

  • 更改地址的增长方向:

当更改地址的增长方向,使之由右至左时,表格更具有可阅读性。

←  地址增长方向
... 0x0A 0x0B 0x0C 0x0D ...

最低有效位(LSB)是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。

←  地址增长方向
... 0x0A0B 0x0C0D ...

最低的16bit单元0x0C0D存储在低位。

[编辑]混合序

混合序(英:middle-endian)具有更复杂的顺序。以PDP-11为例,0x0A0B0C0D被存储为:

  • 32bit在PDP-11的存储方式
地址增长方向  →
... 0x0B 0x0A 0x0D 0x0C ...

可以看作最高的16bit位和低位以大端序存储,但16bit内部以小端存储。

[编辑]处理器体系

[编辑]网络序

网络传输一般采用大端序,也被称之为网络字节序,或网络序IP协议中定义大端序为网络字节序。

伯克利socket API定义了一组转换函数,用于16和32bit整数在网络序和本机字节序之间的转换。htonl,htons用于本机序转换到网络序;ntohl,ntohs用于网络序转换到本机序。

[编辑]位序

一般用于描述串行设备的传输顺序。一般硬件传输采用小端序(先传低位),但I2C协议采用大端序。网络协议中只有数据链路层的底端会涉及到。

[编辑]参见

[编辑]外部链接

字节序之大小端模式

全文http://hjctty.blog.51cto.com/1031616/550626   在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题...
  • frank_jb
  • frank_jb
  • 2016年06月14日 15:39
  • 3287

测试本机操作系统的字节序

看APUE的网络编程部分,讲解字节序时发现自己总是忘记大端法和小端法,总是记混,写了个程序,num = 0x01234567;如果0x67对应的地址是小地址即为小端法,否则为大端法  见程序: #...
  • ustcqi
  • ustcqi
  • 2012年11月21日 19:47
  • 655

测试机器大小端字节序的小程序

现代机器的字节序组织有两种方式,即大端序组织(big endian)和小端序组织(little endian),典型的Intel 80x86 CPU使用的是little endian,而苹果Macin...
  • erhf
  • erhf
  • 2008年03月18日 19:20
  • 7108

cpu字节序(整理)

字节序不是由操作系统决定的,而是由cpu架构决定的。 CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范,主要目的是为了区分不同类型CPU的重要标示。目前市面上的CPU指令集分类主要分有两...
  • qq_30135665
  • qq_30135665
  • 2016年09月10日 19:20
  • 863

字节序转换函数

一直以来都对这个两个函数含含糊糊的,今天又用到所以特意查看linux的源代码(/include/netinet/in.h) # if __BYTE_ORDER == __BIG_ENDIAN /*...
  • IT_small_farmer
  • IT_small_farmer
  • 2015年01月19日 17:43
  • 1274

判断小端字节序和大端字节序的C程序

编写一个C程序,实现32位CPU中存储方式小端字节序和大端字节序的判别。 ONE: #include #define LBS 0 #define MBS 1 { int main(int) { i...
  • u010944778
  • u010944778
  • 2014年12月21日 22:44
  • 1126

(2011.09.17)C/C++中二进制文件的使用以及字节序问题的图示

C/C++中二进制文件的使用以及字节序问题的图示 今天在做项目时联想到了这两个问题,所以实际编程测试了一下,有一些新的收获: 我一直以为自己很熟悉如何使用C/C++中的二进制文件,可今天测试...
  • neicole
  • neicole
  • 2011年09月17日 07:10
  • 1630

linux字节序转换函数和地址转换函数

刚才阅读代码的时候看到了一个字节排序函数,一时想不起具体用法了。想想学习linux下的网络编程也不少时间了,这些字节排序和转换的函数还是不太清楚,容易混淆。今天索性把这方面的知识汇总一下,争取以后能够...
  • jiangyi711
  • jiangyi711
  • 2009年11月06日 01:40
  • 5049

linux网络编程一:主机字节序与网络字节序的的判断

最近在看《linux高性能服务器编程》,在此做个日记,以激励自己,同时分享于有需要的朋友。         现代CPU的累加器一次能装载至少4字节(32位),即一个整数。那么这4字节在内存中排列的...
  • jasonliuvip
  • jasonliuvip
  • 2014年03月30日 13:21
  • 1620

你知道x86是什么字节序吗?还有怎么转换字节序吗?

 不管基於何種理由,網路封包在制定標準的過程中,採用的是big endian的系統,而x86 CPU 所使用的,則是little endian系統,因此對使用x86的CPU而言,網路程式的設計就必須額...
  • messagebox
  • messagebox
  • 2007年07月31日 11:05
  • 565
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字节序
举报原因:
原因补充:

(最多只允许输入30个字)