几何尺寸与公差论坛

 找回密码
 注册
查看: 3146|回复: 2

字节序是什么意思

[复制链接]
发表于 2007-5-10 15:33:57 | 显示全部楼层 |阅读模式
有关字节序的问题     
  http://www.douzhe.com   作者:jobman     发表于:2003-07-25   23:42:46     
   
  对于不同软件和硬件之间的差异,在技术人员看来除了叹息,不会有更多的情绪     
   
  ,这样的现象是多种原因造成的,可是对于人为的差异,我总是痛恨不已,字节     
   
  序就是这样一个列子。     
  简单的说,字节序就是在处理数字时,机器和实际数字高低位顺序,也就     
   
  是:     
  数字:0x10   00   20         
  little-endian机器:20   00   10      
  big-endian       机器:10   00   20      
  这样的差异是由   CPU   决定的,当前流行的   cpu   据我所知IBM的power-pc     
  是   big-endian     的,其他基本是   little-endian   的。     
  这样的差别导致在异种平台交换数据时可能发生问题,当然在异种平台间交换数据是     
   
  一个敏感的问题,有很多方法可用,这里不讨论。不过在编程时,也会有这样的     
   
  问题,看一下这种情况:     
      [code:1:8c0a01ddec]*((short*)"AB")   >>   8   [/code:1:8c0a01ddec]结果:     
  [code:1:8c0a01ddec]little-endian   =   'B'     
        big-endian   =   'A'[/code:1:8c0a01ddec]这个语句可以用来判断机器字节序.     
  如果在字节序不同的平台间的交换数据必须进行转换,比如对于   int   类型:     
  big-endian   写入文件      
  [code:1:8c0a01ddec]int   i   =   100;     
  write(   fd,   &i,   sizeof(int)   );[/code:1:8c0a01ddec]little-endian   读出后      
  [code:1:8c0a01ddec]int   i;     
  read(   fd,   &i,   sizeof(int)   );     
  char   buf[sizeof(int)];     
  memcpy(   buf,   &i,   sizeof(int)   );     
  for(   i   =   0;   i   <   sizeof(int);   i   ++   )     
  {     
  int   v;     
  v   =   buf[sizeof(int)   -   i   -   1];     
  buf[sizeof(int)   -   1]   =     buf;     
  buf   =   v;     
  }     
  memcpy(   &i,   buf,   sizeof(int)   );[/code:1:8c0a01ddec]这仅仅是个列子,在异钟平台间直接传递二进制数据,即使不存在字节序的问题,也不是一个明智的方法,作     
   
  为可选的方式就是使用文本来交换数据,这样至少可以避免字节序的问题。     
   
  很多的加密算法为了追求速度,都会采取字符串和数字之间的转换,在计算完毕     
   
  后,必须注意字节序的问题,在某些实现中可以见到使用预编译的方式来完成,     
   
  这样很不方便,如果使用前面的语句来判断,就可以自动适应了。
 楼主| 发表于 2007-5-10 15:34:57 | 显示全部楼层

回复: 字节序是什么意思

大端小端针对多字节数据存储时字节顺序而言的   
   
  所谓"Little   Endian",为INTEL所采用模式,数据的低字节存放在内存低地址中,高字节存放在高地址中,即学X86时说的“高高低低”原则。Byte3   Byte2   Byte1   Byte0在内存中对应的是:   
   
              Base   Address+0       Byte0   
              Base   Address+1       Byte1   
              Base   Address+2       Byte2   
              Base   Address+3       Byte3   
   
              所谓"Big   Endian"   ,为MOTO所采用模式,数据的低字节存放在内存的高地址,数据的高字节存放在内存的低地址。Byte3   Byte2   Byte1   Byte0在内存中对应的是:   
   
              Base   Address+0       Byte3   
              Base   Address+1       Byte2   
              Base   Address+2       Byte1   
              Base   Address+3       Byte0
 楼主| 发表于 2007-5-10 15:35:38 | 显示全部楼层

回复: 字节序是什么意思

想想看,当年intel的cpu还是8088的时候,处理字长是16bits是很先进的cpu了,并没有多少基于它的专有软件。他考虑了低位在前高位在后的字节序是为了跟更早的8位计算兼容,那年月很多软件用汇编写的。   
  这样当汇编代码是   
  mov   al,byte   ptr   [1234h]   
  adc   cl,al   
  的代码就可以很自然地升级为   
  mov   ax,word   ptr   [1234h]   
  adc   cx,dx   
  因为在做了操作字对齐以后原来代码中数据段的1234这个地址的数据高位为0,保留了兼容。   
  还有一些基于栈跳转的技巧更是byte必争。所以intel的字节序就这么定下来了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-12-22 18:35 , Processed in 0.044702 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表