逆向工程核心原理笔记(二)——小端序标记法
字节顺序,又被称为端序或者是尾序,在计算机科学领域中,这存储器中或在数字通信链路中,组成多个字节的字的字节的排列顺序。
在几乎所有的机器上,多字节的对象都被存储为连续的字节序列,例如在 C 语言中,一个类型为 int 的变量 x 的地址为 0x100,那么其对应的指针为 &x = 0x100,并且 x 的四个字节将被存储在内存的 0x100,0x101,0x102,0x103的位置。
字节的排列顺序通常有两种方式,例如一个多位的整数,按照春初地址从低到高排序的字节中,如果这个整数的最低有效字节(类似于最低有效位)在最高有效字节的前面,则被称为小端序,反之则称为大端序,在网络应用中,字节序是一个必须被考虑到的因素,因为不同的机器类型可能采取不同的标准的字节序,所以需要按照网络标准进行转化。
如果我们加上上述变量 x 的类型为 int ,位于地址 0x100 处,他的值是 0x1234567,地址范围是 0x100 ~ 0x103 字节,但是其内部排列顺序则依赖于机器的类型,大端法从首位开始将是:0x100 0x101 0x102 0x103,而小端法将是:0x103 0x102 0x101 0x100
在大端序中,字符的排列顺序如下:
----------------- | ----------------- | 地址增 | 长方向 | ----------------- | ----------------> |
---|---|---|---|---|---|
… | 0x01 | 0x02 | 0x03 | 0x04 | … |
在上面的示例中,最高位的字节是 0x01 存储在最低位的内存地址处,下一个字节存储在后面的地址处,类似于十六进制从左向右的阅读习惯。
在小端序中字符的排列顺序如下:
----------------- | ----------------- | 地址增 | 长方向 | ----------------- | ----------------> |
---|---|---|---|---|---|
… | 0x04 | 0x03 | 0x02 | 0x01 | … |
在上面个的示例中,最低位的字节是 0x04 ,存储在最低位的内存地址处,下一个字节存储在后面的自持处,将地址存储方向进行更改可以获得更好的阅读性。
采用大端序保存多字节数据非常指端,它常用于大型的 UNIX 服务器和 RISC 系列的 CPU 中,才外,网络协议中也经常采用大端序的方式。
在 Intel x86 CPU 中采用了小端序存储,小端序采用逆序的方式进行存储,使用小端序进行算数运算和扩展缩小数据的时候,效率会非常高。