第3章 小端序标记法

在计算机领域中,字节序(Byte Ordering)是多字节数据在计算机内存中存储或网络传输时各字节的存储顺序.分为小端序(Little endian)和大端序(Big endian).

1. 字节序

1
2
3
4
BYTE b = 0x12;
WORD w = 0x1234;
DWORD dw = 0x12345678;
char str[ ] = "abcde";

以下为不同数据根据不同字节序保存时的不同:

TYPE Name SIZE 大端序类型 小端序类型
BYTE b 1 [12] [12]
WORD w 2 [12][34] [34] [12]
DWORD dw 4 [12][34][56][78] [78][56][34][12]
char[] str 6 [61][62][63][64][65][00] [61][62][63][64][65][00]

提示:
查看ASCII码表,字母a的ASCII码的十六进制表示为0x61,字母e的ASCII码的十六进程表示为0x65. 字符串最好都是以NULL结尾.
因为数据类型为字节型(BYTE),其长度都为1个字节,所以保存在大端序类型或者小端序类型,字节顺序都一致!如果数据长度超过2个字节,则会在大端序和小端序上面存储的数据不同.如果是字符串被保存在数组str中,字符数组在内存中连续,此时无论在大端序还是小端序,存储顺序都相同!

1.1 大端序和小端序

大端序常用于大型UNIX服务器的RISC系列的CPU中,而小端序采用逆向式存
储数据,在Intel x86 CPU常用到.

1.2 在OllyDbg中查看小端序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "windows.h"
BYTE b = 0x12;
WORD w = 0x1234;
DWORD dw = 0x12345678;
char str[] = "abcde";
int main(int argc, char *argv[])
{
BYTE lb = b;
WORD lw = w;
DWORD ldw = dw;
char *lstr = str;
return 0;
}

用OllyDbg调试,用Go to命令(Ctrl+G)跳转到401000地址
main()函数

main()函数地址为401000,全局变量b、w、dw、str地址分别为40AC40、40AC44、40AC48、40AC4C.可以来到数据窗口用Go to命令跳转到40AC40处.
全局变量的内存区域

可以看到,变量w与dw中的数据都采用了小端序存储.