在网络通信中,字节序(Byte Order)决定了多字节数据(如int,short)在内存中是如何存放的。如果发送方和接收方的存储顺序不一致,数据就会像被“倒着读”一样,变成完全错误的值。
一、 大端 vs 小端:内存里的博弈
对于一个 4 字节整数0x12345678(十六进制),内存地址从低到高(0x00 -> 0x03),到底该怎么存?
| 模式 | 名称 | 存储规则 (笔记口诀) | 内存低地址 (0x00) | 内存高地址 (0x03) | 典型应用 |
|---|---|---|---|---|---|
| 小端序 | Little-Endian | 低低高高 (低位字节存低地址) | 78(低位) | 12(高位) | PC 机(x86/ARM) |
| 大端序 | Big-Endian | 低高高低 (高位字节存低地址) | 12(高位) | 78(低位) | 网络标准 |
核心结论:
- PC 本地存储通常是小端序(反人类直觉)。
- 网络传输标准必须是大端序(符合人类直觉)。
- 单字节类型(如
char, 字符串)不需要考虑字节序。
二、 代码实战 1:亲眼看看内存里的“倒序”
我们编写一段 C 代码,利用union(共用体)的特性,查看一个整数在内存中真正的字节排列,并演示htonl函数如何将其“修正”。
代码 (endian_view.c)
#include<stdio.h>#include<arpa/inet.h>// 定义一个共用体:允许用两种方式访问同一块内存typedefunion{unsignedintvalue;// 4字节整数unsignedcharbytes[4];// 4字节数组(用于逐字节查看)}MemoryViewer;voidshow_memory(constchar*label,MemoryViewer mv