在网络编程中,必然会不可避免字节序的问题。
字节序,字节在内存中的存放顺序,当然一个字节的数据不必考虑字节序的问题。
字节序分为两类,Big-Endian(Motorola的PowerPC系列CPU),little-Endian(Intel的x86系列CPU)。
两种字节序的解释如下:
1.Big-Endian,内存低地址存放最高有效字节,内存高地址存放最高有效字节。
2.Little-Endian,内存低地址存放最低有效字节,内存高地址存放最高有效字节。
举例,比如数据0x12345678对于两种不同的字节序在内存中的数据存放顺序如下图所示:
Big-Endian
低地址 高地址
---------------------------->
+++++++++++++++++++++++++++++
| 12 | 34 | 56 | 78 |
+++++++++++++++++++++++++++++
Little-Endian
低地址 高地址
---------------------------->
+++++++++++++++++++++++++++++
| 78 | 56 | 34 | 12 |
+++++++++++++++++++++++++++++
图 1
从上图可以看出,采用Big-Endian方式存储数据是符合人类的思维习惯,对于一个字节的数据,其字节内的8个比特之间也存在比特序的问题,不多介绍,详情请Google之。
判断一个CPU的字节序是Big-Endian,还是Little-Endian,下面是详细的代码:
1.
#include
#include
#include
int main()
{
int i = 1;
char *cp = (char *)&i;
if(*cp)
printf("Little-Endian\n");
else
printf("Big-Endian\n");
return 0;
}
2.
#include
#include
#include
union
{
int a;
char b[sizeof(int)];
}u;
int main()
{
u.a = 1;
int i = 0;
if(u.b[0] == 1)
{
printf("Little-Endian\n");
}
else if(u.b[sizeof(int) - 1] == 1)
{
printf("Big-Endian\n");
}
else
printf("Unknown Endian\n");
printf("Now,look at every byte in the memory\n");
for(i=0;i
{
printf("Address:%p,Value:%x\n",&u.b[i],u.b[i]);
}
return 0;
}
3.
#include
int main()
{
int i = 0x0001;
(char)i?printf("Little-Endian\n"):printf("Big-Endian\n");
return 0;
}
阅读(648) | 评论(0) | 转发(0) |