大端和小端是用来描述字节在内存中存储的顺序:
大端 (big endian):内存中的高位地址。
小端 (little endian):内存中的低位地址。
字节序的最小数据单位是字节(Byte)而不是比特(Bit),对于单个 char
不需要关心字节序。
举例:
数值 0xabcdef
在大端和小端模式下的字节序,使用 C 语言表示为:
union {
int value;
char bytes[4];
} payload;
payload.value = 0xabcdef;
// 如果是大端模式,高位存在低地址、低位存在高地址
payload.bytes[0] == 0;
payload.bytes[1] == 0xab;
payload.bytes[2] == 0xcd;
payload.bytes[3] == 0xef;
// 如果是小端模式,高位存在高地址、低位存在低地址
payload.bytes[0] == 0xef;
payload.bytes[1] == 0xcd;
payload.bytes[2] == 0xab;
payload.bytes[3] == 0;
以上代码中 bytes[0]
- bytes[3]
表示从低地址往高地址读取数据。
数值的比特(Bit)位不受大端和小端的影响,因为这是两个完全不同的概念。
UTF 字符编码与字节序
对于任何字符编码,编码单元的顺序是由编码方案指定的,与字节序无关。
UTF-8 是单编码,所以不需要考虑字节序。
UTF-16 和 UTF-32 是多字节编码,需要考虑字节序,所以有 UTF-16LE、UTF-16BE 和 UTF-32LE、UTF-32BE 的区别。