引言:
Big endian machine: It thinks the first byte it reads is the biggest.
Little endian machine: Thinks the first byte it reads is the littlest.
字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。因而对int、uint16、uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺序。通常我们认为,在空中传输的字节的顺序即网络字节序为标准顺序,考虑到与协议的一致以及与同类其它平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字节序转换为主机字节序。
在本LINUX的书里介绍到INTEL的CPU使用的小端字节序 其他比MOTOROLA
68000系列CPU使用的是大端字节序 如果不转换 将数据通过网络发出时 比如MOTOROLA发一个16位数据:0X1234 传送到INTEL时
就被INTEL解释为0X3412 也就是4660成了13330 所以有时候需要一些函数来进行大小端字节序的转换
前段时间,一直不是很明白字节序影响数据的粒度以及这个概念,今天刚好有时间,索性测试一下:
采用VC在windows XP,Intel cpu上进行测试小端对齐(Little endian )
{
/*测试字节序以及有关字节序能够影响的最小颗粒(字节还是四个bit)*/
int iNum = 0;
typedef struct sInt{
char cSingle1;
char cSingle2;
char cSingle3;
char cSingle4;
}sInt;
sInt sIntSon = {0};
sIntSon.cSingle1 = 0x01;
sIntSon.cSingle2 = 0x02;
sIntSon.cSingle3 = 0x03;
sIntSon.cSingle4 = 0x04;
memcpy(&iNum,&sIntSon,sizeof(sIntSon));
printf("\n output int 's four char number\n");
printf("\n first = 0x%x, second = 0x%x , third = 0x%x , forth = 0x%x , iNum = 0x%x\n",
sIntSon.cSingle1,sIntSon.cSingle2,sIntSon.cSingle3,sIntSon.cSingle4,iNum);
}
运行结果:
output int 's four char number
first = 0x1, second = 0x2 , third = 0x3 , forth = 0x4 , iNum = 0x4030201
Press any key to continue
分析:
1。结构体中子节是升序存放,经过内存拷贝后,int 中四个字节升序,刚好验证 Little endian 方式
2。同时,字节内的顺序不变,说明字节序影响的粒度为字节
posted on 2007-10-15 00:23
风筝 阅读(710)
评论(2) 编辑 收藏 引用 所属分类:
技术点滴