资料来源: http://blog.chinaunix.net/u/13279/showart.PHP? id=177436
网络字节顺序和主机字节顺序
job Edward.cublog.cn 2006-09-2716336036336018
网络字节顺序和主机字节顺序
这些字节序类型因CPU而异。整数存储在内存中的顺序称为主机顺序
最常见的有两种
1. Little endian :将低位字节存储在起始地址中
2. Big endian :在起始地址中存储高位字节
生命周期
最符合人类思维的印第安人
地址低位存储值低位
地址高位存储值高位
怎么说最符合人的思维的印第安人,从人的第一观点来说
如果低位的值小,则需要放在存储器地址小的地方,即存储器地址的低位
相反,高位值应该放在存储器地址大的地方,即存储器地址的高位
BE big-endian
最直观的字节序
地址低位存储值高位
地址高位存储值低位
为什么是直觉,请不要想对应关系
只需从左到右按照从低到高的顺序写存储器地址即可
按正常从上到下的顺序导出值
比较两者,一个字节一个字节地填充
示例:如何在内存中存储双字符0x01020304(dword )
存储器地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04
示例:将0x1234abcd写入以0x0000开头的内存后,结果将显示为
二端照明
0x00000x120xcd光盘
0x00010x230xab
0x00020xab0x34
0x00030xcd0x12
所有x86系列CPU都是little-endian的字节序。
网络字节顺序是TCP/IP规定的数据表示形式,与特定的CPU类型、操作系统等无关,可确保数据在不同的主机之间正确传输。 网络字节顺序采用big endian排序方式。
向进行变换的BSD插座提供变换的函数有以下4个
htons将无符号短类型从主机序列转换为网络序列
htonl将无符号长整型从主机序列转换为网络序列
ntohs将无符号短类型从网络序列转换为主机序列
ntohl将无符号龙类型从网络序列转换为主机序列
在使用little endian的系统上,这些函数转换字节序
在使用big endian类型的系统上,这些函数被定义为空宏
同样,应该注意的是,在网络程序开发和跨平台开发时,不仅是一种字节序,也要保证两者的解释不同会产生错误。
注:
1、网络和主机的字节转换函数:htonsntohshtonlntohl(s为short l为long h,host n为network ) )。
2、不同的CPU运行不同的操作系统,字节序也不同。 请参照下表。
处理器操作系统字节排序
阿尔法所有的Little endian
HP-PA NT Little endian
HP-PA UNIX Big endian
Intelx86littleEndian----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