在网络编程以及跨平台编程里面经常会提到Little-Endian 和 Big-Endian 的概念,本文就此内容做个总结。 2010-3-13 wcdj 参考资料: http://bbs.chinaunix.net/viewthread.php?tid=823662#
Little-Endian 和 Big-Endian 是表示计算机字节顺序的两种格式 ,所谓的字节顺序 指的是长度跨越多个字节的数据的存放形式 。
假设从地址 0x00 00 00 00 开始的一个字 (4 个字节 ) 中保存有数据 0x1234abcd( 十六进制 ) ,那么在两种不同的内存顺序的机器上从字节的角度去看的话分别表示为:
1) Little-Endian 在内存中的存放顺序是:
0x00000000-0xcd ( 低字节放在低位 )
0x00000001-0xab
0x00000002-0x34
0x00000003-0x12
2) Big-Endian 在内存中的存放顺序是:
0x00000000-0x12
0x00000001-0x34
0x00000002-0xab
0x00000003-0xcd ( 低字节放在高位 )
需要特别说明的是,以上假设机器是每个内存单元以 8 位即一个字节为单位的。
简单的说, Little-Endian 把低字节存放在内存的低位 ;而 Big-Endian 将低字节存放在内存的高位 。
现在主流的 CPU , intel 系列的是采用的 Little-Endian 的格式存放数据,而 motorola 系列的 CPU 采用的是 Big-Endian 。
以下是判断字节 存储 顺序的可移植的C 语言代码:
在网络编程中, TCP/IP 统一采用 Big-Endian 方式传送数据,也就是说,假设现在是在一个字节顺序是 Little-Endian 的机器上传送数据,要求传送的数据是 0X12345678 ,那么你就要以 0X78563412 的顺序在 unsigned int 中存放这个数据,只有这样才能保证存放的顺序满足 TCP/IP 的字节顺序要求。很多时候,需要自己编写应用层的协议,字节顺序的概念在这个时候就显得及其重要了。
下面给出的是在 Little-Endian 和 Big-Endian 中相互转换的代码, C 语言强大的位操作的能力在这里显示了出来:
更详细的资料如下: