跳转至

大小端序

最开始接触大小端序是在学 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

这也解释了为什么逆向时经常会遇到: 内存里看到的字节顺序,和算法文档里写的整数顺序,看起来是“反过来的”。