字节序

本文介绍了字节序的基本概念,包括MSB和LSB等术语,详细解析了little-endian、big-endian及middle-endian的不同存储方式。同时提供了判断目标系统字节序的方法,并讨论了如何编写字节序无关的程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是字节序
  字节序(byte order),即字节存储顺序,是处理器在处理多字节数据时,在寄存器和内存中保存字节的顺序。

  相关术语:
  MSB (Most Significant Byte),最高有效字节,是一个数据中权值最大的那一个字节。
  LSB (Least Significant Byte),最低有效字节,是一个数据中权值最小的那一个字节。
  比如数字1234(一千二百三十四),1的权值最大,表示千,就可称为MSB。

  little-endian,字节序的一种,称为小端,是按照“低地址存放低位数据”的原则处理多字节数据的。
  big-endian,字节序的一种,称为大端,是按照“低地址存放高位数据”的原则处理多字节数据的。
  middle-endian,也称作PDP-endian,字节序的一种,称为中端,在存储32位整数的时候,用来形成整数的两个16位字节采用big-endian存储,用来形成16位整数的两个8位字节采用little-endian存储。
  比如32位整数0x01020304,在little-endian中按照如下方式存储:
  地址A   0x01
  地址A+1 0x02
  地址A+2 0x03
  地址A+3 0x04
  在big-endian中按照如下方式存储:
  地址A   0x04
  地址A+1 0x03
  地址A+2 0x02
  地址A+3 0x01
  在middle-endian中按照如下方式存储:
  地址A   0x03
  地址A+1 0x04
  地址A+2 0x01
  地址A+3 0x02

  我们常见的大部分处理器都采用little-endian;少部分采用big-endian,如PowerPC;而MIPS和ARM处理器可通过配置采用不同的字节序,通常默认采用little-endian(ARM始终采用big-endian存储浮点数);middle-endian使用很少。

 

2.如何判断目标系统的字节序
  bool IsBig_Endian()
  {
    unsigned short test = 0x1122;
    if(*( (unsigned char*) &test ) == 0x11)
       return TRUE;
    else
       return FALSE;
  }
  如果字节序为big-endian,返回true;如果为little-endian,返回false。


3.如何编写字节序无关的程序
  字节序问题,通常在我们从文件或网络读取一个不同于本机字节序的多字节数据时出现。我们说的字节序无关,实际上是判断获取到的文件的字节序,自动转换为本机字节序。
  如果程序中使用到了GNU C函数库,可以再源程序中包含<endian.h>头文件,并通过该文件中已经定义好的_BYTE_ORDER宏来判断目标系统的字节序。示例程序如下:
  #if _BYTE_ORDER == _LITTLE_ENDIAN
    /*do something for little endian*/
  #elif _BYTE_ORDER == _BIG_ENDIAN
    /*do something for big endian*/
  #elif _BYTE_ORDER == _PDP_ENDIAN
    /*do something for pdp endian*/
  #endif

  在网络通讯中,还涉及到网络字节序和主机字节序两个概念。定义网络协议时,都制定采用big-endian。那么通用的办法就是,无论主机字节序是什么,向网络上发送前都使用htons或htonl将其转换为网络字节序;从网络接收到的数据,无论主机字节序是什么,都使用ntohs或ntohl转换为主机字节序。
  htons()把主机上的short型数据转换成按网络字节序排列的short型值数据 
  htonl()把主机上的long型数据转换成按网络字节序排列的long型数据
  ntohs()把网络上的short型数据转换成按主机字节序排列的short型数据
  ntohl()把网络上的long型数据转换成按主机字节序排列的long型数据

 

  在移植程序的过程中,也应该注意字节序问题。曾经遇到过使用相同的交叉编译工具链,编译出来的程序提示格式不正确,无法运行。使用file命令查看才看到LSB和MSB的区别。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值