计算机硬件有两种储存数据的方式:大端字节序(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);
参考文章:理解字节序 - 阮一峰的网络日志
0 条评论