
大端和小端是计算机存储多字节数据时字节在内存中的排列方式。一、字节 Byte假设有一个32位整数它占4个字节32bit。uint32_t value 0x12345678;这个数可以拆成4个字节0x12 0x34 0x56 0x78可以画成0x12345678 ┌──────┬──────┬──────┬──────┐ │ 0x12 │ 0x34 │ 0x56 │ 0x78 │ └──────┴──────┴──────┴──────┘这里 0x12 是最高字节MSBMost Significant Byte最高有效字节0x78 是最低字节LSBLeast Significant Byte最低有效字节二、内存地址CPU访问内存时每个字节都有一个地址。例如地址 0x1000 0x1001 0x1002 0x1003四个地址连续。那么问题来了0x12 放在哪这就是大端小端的问题三、大端例如value 0x12345678内存地址 数据 0x1000 --- 0x12 0x1001 --- 0x34 0x1002 --- 0x56 0x1003 --- 0x78画成图也就是低地址放高字节简称大高低低地址 高地址 0x1000 0x1001 0x1002 0x1003 ---------------------------- | 12 | 34 | 56 | 78 | ----------------------------四、小端地址 数据 0x1000 --- 0x78 0x1001 --- 0x56 0x1002 --- 0x34 0x1003 --- 0x12画成图低地址放低字节低地址 高地址 0x1000 0x1001 0x1002 0x1003 ---------------------------- | 78 | 56 | 34 | 12 | ----------------------------五、两者对比假设value 0x12345678大端地址 1000 1001 1002 1003 12 34 56 78小端地址 1000 1001 1002 1003 78 56 34 12注意value 永远都是0x12345678没有变。只是内存排列不同。很多初学者看到0x12345678会以为内存一定是 12 34 56 78其实这是数值的书写方式不是内存布局。可以把它们区分开数值表示我们通常写成0x12345678最高有效字节在左这是数学上的表示方式与大小端无关。内存布局字节实际放在内存地址中的顺序这才由大端或小端决定。大端解析static void DECODE_BYTE_VECTOR_BIGEDIAN_TO_4B(uint32_t* value_ptr, uint8_t* arr) { *((uint32_t*)value_ptr) (uint32_t)arr[0] 24 | (uint32_t)arr[1] 16 | (uint32_t)arr[2] 8 | (uint32_t)arr[3] 0; }小端解析第一种static void DECODE_BYTE_VECTOR_LITTLEENDIAN_TO_4B(uint32_t *value_ptr, uint8_t *arr) { *value_ptr ((uint32_t)arr[0] 0) | ((uint32_t)arr[1] 8) | ((uint32_t)arr[2] 16) | ((uint32_t)arr[3] 24); }第二种直接 memcpy仅适用于本机也是小端static void DECODE_BYTE_VECTOR_LITTLEENDIAN_TO_4B(uint32_t *value_ptr, uint8_t *arr) { memcpy(value_ptr, arr, sizeof(uint32_t)); }