理解字节序

前言

估计很多人和我一样,在debug过程中见到字节序就头大,比如wireshark里看到的是0x04d5表示一个长度,这个长度到底是多少呢?还比如 IP部分是 01020304,这到底是1.2.3.4还是4.3.2.1呢?

分清字节序

肯定是和计算机相关,计算机处理输入的时候肯定是一个字节,一个字节的顺序处理,而且从效率上考虑也是先处理低字节,后处理高字节。但我们人类还是习惯从高往低读,比如你的工资是几千几百几十万几千几百几十几。

那计算机是怎么读取数据的呢?都是按内存地址来,从低到高的来。先读到低的,然后处理低的。这就是小端。

那么网络的大端,是怎么回事呢?因为制定网络协议的时候,是写在纸上给人看的,所以自然需要按照人的读写方式。比如长度
是258,占2个字节,那么就需要写成0x0102。因为这样才符合人类的阅读方式。1 * 256 +2 = 258。所以1.2.3.4的IP地址会在wireshark里显示0x01020304.因为是人类的方式.

然后我们规定在网络传输中使用大端。即高位字节先传输,地位自己后传输。所以我们以内存接受数据的时候,自然是先写低地址,后写高地址,也就是把高字节写到了低地址。也就是大端,所以需要处理的时候,还需要调用ntoh翻转一下,即低位放在低地址上。

你明白了么?