posts - 48,comments - 29,trackbacks - 0

引言:   
    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)  编辑 收藏 引用 所属分类: 技术点滴

FeedBack:
# re: 一个有关字节序的实验
2007-10-17 22:20 | 大卫
挑灯夜读,呵呵。看来做软件也不容易  回复  更多评论
  
# re: 一个有关字节序的实验
2007-10-22 20:19 | 风筝
还好,那天兴起,刚好测试一下,明白了一个问题,挺爽!!
我认为,只要工作喜欢,什么都好,呵呵  回复  更多评论
  
只有注册用户登录后才能发表评论。