1,什么是字节顺序
指的就是数据在内存里存储的顺序,通常我们默认一个存储单元为1Byte,一个逻辑数据比如Float是4个Byte,它在内存理存储的顺序可以是高位在前,也可以是低位在前.这样就有区分了.
2,有些什么顺序:
Big-Endian(MSB),高位在低地址
Little-Endian(LSB),低位在低地址
Endian指的是当物理上的最小单元比逻辑上的最小单元小时,逻辑到物理的单元排布关系
3,为什么要有字节顺序?
因为程序需要与外界通讯,传送数据,这里的外界包括其他机器和其他语言写的程序.比如x86下c++程序与linux底下的程序通讯,比如c++和java的程序通讯.都会涉及到字节存放顺序的问题.
4,哪些会是Big-Endian,哪些会是Little-Endian
网络协议都是Big-Endian的,Java编译的都是Big-Endian的
Motorola的PowerPC是Big-Endian的
x86系列则采用Little-Endian方式存储数据。
ARM同时支持 big和little,实际应用中通常使用Little-Endian
以上内容转载自:http://www.cnblogs.com/kiddo/archive/2007/09/03/879941.html
因为现行的计算机都是以八位一个字节为存储单位,那么一个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);
以上内容转载自:http://www.sf.org.cn/Article/base/200606/18679.html
另外还有Windows Sockets:字节排序
http://msdn.microsoft.com/zh-cn/library/cc468322(v=vs.71).aspx