计算机硬件的两种存储数据的方式
- 大端字节序 little endian
- 小端字节序 big endian
举例来说数值0x1234使用两个字节存储,数值高位字节是0x12,数值低位字节是0x34
- 大端字节序:高位字节在前,低位字节在后,这是人类读取数值的方式
- 小端字节序:低位字节在前,高位字节在后,即以0x3412的形式存储
同理数值0x12345678的存储方式如下表所示
存储方式 | address:0x1000 | 0x1001 | 0x1002 | 0x1003 | 0x1004 | 0x1005 |
---|---|---|---|---|---|---|
大端存储 big endian | 12 | 34 | 56 | 78 | ||
小端存储 little endian | 78 | 56 | 34 | 12 |
- 大端字节序先读到数值高位字节,小端字节序先读到数值低位字节序
- 只有读取的时候才区分字节序,其他情况不用考虑
转换公式如下
//处理器读入16位整数(大端字节序),占两个字节
x = buffer[offset] * 256 + buf[offset+1];
x = buffer[offset] << 8 | buffer[offset+1];
//处理器读入16位整数(小端字节序),占两个字节
x = buffer[offset] + buffer[offset+1]*256;
x = buffer[offset] | (buffer[offset+1] << 8);
//同理32位整数(大端字节序)
i = (data[3] << 0) | (data[2] << 8) | (data[1] << 16) | (data[0] << 24);
//32位整数(小端字节序)
i = (data[0] << 0) | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);