计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。

举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11

  • 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
  • 小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。

同理,0x1234567的大端字节序和小端字节序的写法如下图。

举例来说,处理器读入一个16位整数。如果是大端字节序,就按下面的方式转成值。

x = buf[offset] * 256 + buf[offset+1];

上面代码中,buf是整个数据块在内存中的起始地址,offset是当前正在读取的位置。第一个字节乘以256,再加上第二个字节,就是大端字节序的值,这个式子可以用逻辑运算符改写。

x = buf[offset]<<8 | buf[offset+1];

上面代码中,第一个字节左移8位(即后面添8个0),然后再与第二个字节进行或运算。

如果是小端字节序,用下面的公式转成值。

 x = buf[offset+1] * 256 + buf[offset];

32位整数的求值公式也是一样的。

 /* 大端字节序 */
 i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);

 /* 小端字节序 */
 i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

参考文章:理解字节序 - 阮一峰的网络日志


前天遇到了小鹿,昨天是小兔子,今天是你。