在看《linux 网络编程技术》时,提到了字节顺序的问题。知道网络上的机器在表示数据的字节顺序是不同的,如i386芯片是地字节在内存地址的地端,高字节在高端,而alpha芯片却相反。基于intel芯片的计算机采用的是数据存放顺序是倒序存放,称之为主机字节顺序;而internet上传送数据的是顺序存放的,称之为网络字节顺序。在数据被发送到网络之前,必须进行字节顺寻转换。可是还是有许多不明白,在网上找了些资料。
主机字节顺序(Host)
Little-Endian [ Intel、VAX和Unisys处理器 等]
小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处
网络字节顺序(Network)
Big-Endian [ IBM 370、Motorola和大多数RISC设计 ---- IBM 大型机和大多数Unix平台 ]
现行的计算机都是以八位一个字节为存储单位,那么一个16位的整数,也就是C语言中的short,在内存中可能有两种存储顺序big- endian和litte-endian.考虑一个short整数0x3132(0x32是低位,0x31是高位),把它赋值给一个short变量,那么它在内存中的存储可能有如下两种情况:
| |
| 0x31 | 0x32
|________________ | ________________
| |
| 0x32 | 0x31
|________________ | ________________
低位字节在高位字节的前面,也就是低位在内存地址低的一端.可以这样记住(小端->低位->在前->与正常逻辑顺序相反)
short test;
FILE* fp;
test = 0x3132; //(31ASIIC码的’1’,32ASIIC码的’2’)
fwrite(&test, sizeof(short), 1, fp);
fclose(fp);
#define sw16(x)
((short)(
(((short)(x) & (short)0x00ffU) << 8) |
(((short)(x) & (short)0xff00U) >> 8) ))
我们改写一下上面的程序
#define sw16(x)
(((short)(x) & (short)0x00ffU) << 8) |
(((short)(x) & (short)0xff00U) >> 8) ))
// 因为x86下面是低位在前,需要交换一下变成网络字节顺序
short test;
FILE* fp;
test = htons(0x3132); //(31ASIIC码的’1’,32ASIIC码的’2’)
if ((fp = fopen ("c:/test.txt", "wb")) == NULL)
fwrite(&test, sizeof(short), 1, fp);
fclose(fp);
本文出自 “国产0与1” 博客,http://qq164587043.blog.51cto.com/261469/50380