大小端序¶
最开始接触大小端序是在学 TEA/XTEA/XXTEA 的时候。逆向时经常看到 IDA 里给出的 key 是按小端序组合的,自己写解密代码时需要手动调整字节顺序。那时候总是记不清区别,也不太理解为什么会有这种差异。
区别¶
- 大端序(Big Endian):高位字节存储在低地址,低位字节存储在高地址。
- 小端序(Little Endian):低位字节存储在低地址,高位字节存储在高地址。
例如,整数 0x12345678 在内存中的存储方式如下:
| 地址 | 大端序 | 小端序 |
|---|---|---|
| 0x00 | 0x12 | 0x78 |
| 0x01 | 0x34 | 0x56 |
| 0x02 | 0x56 | 0x34 |
| 0x03 | 0x78 | 0x12 |
为什么会有差异¶
从人类阅读角度看,大端序更直观:
我们通常把一个整数写成 0x12345678,高位在前,低位在后;而内存地址又常按从低到高顺序展示,所以大端序显示出来更符合人的阅读习惯。
但从底层实现和运算角度看,小端序有它的便利性。 整数运算通常是从低位开始处理,再逐步向高位传播进位;小端序把最低有效字节放在最低地址,这使得低位截断、低位扩展、多精度运算等场景更自然。现代主流 CPU 架构和软件生态也大多采用小端序,因此小端序在实际系统中更常见。
使用场景¶
- 小端序:现代主流 CPU 和操作系统中更常见,如 x86/x64、ARM 的常见运行模式等。
- 大端序:在一些网络协议中被规定为统一字节序,也称为 network byte order。
这也解释了为什么逆向时经常会遇到: 内存里看到的字节顺序,和算法文档里写的整数顺序,看起来是“反过来的”。