字节序笔记

字节序简述

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

一般来说,计算机硬件的存储方式都是小端字节序

而网络数据包为了可读性更高,会选择大端字节序

从地址低端向地址高端,小端字节序是将多字节数据按从低位到高位的顺序存储;而大端字节序是将多字节数据按从高位到低位的顺序存储。

例如 0x01234567 的两种字节序存储方式如下图:

0x01234567的字节序

一般来说,只有在数据交换和读取数据的时候才需要注意字节序,例如 PowerPC 的数据转换成 Windows 下的数据的时候需要注意字节序问题;或是数据包数据的转换 (比如说C语言里的 htons 函数可以将主机字节顺序转变成网络字节顺序)。

C++ 实现

1
2
3
4
5
6
7
8
9
WORD littleEndianToWord(const BYTE* a)
{
return (a[0] << 8) | (a[1]);
}

DWORD littleEndianToDword(const BYTE* a)
{
return (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | (a[3]);
}

对于大端字节序转储,在C++中直接使用强制类型转换即可。

python 实现

1
2
3
4
def littleEndianToDword(a):
return int(str(a[0])+str(a[1])+str(a[2])+str(a[3]), 16)
def bigEndianToDword(a):
return int(str(a[-1])+str(a[-2])+str(a[-3])+str(a[-4]), 16)

同时 python 也存在函数可以将大端字节序的 bytes 数组转储为 int 型数据

1
int.from_bytes(b'', 'big')