大小端模式和网络字节序

概念:
在几乎所有的机器上,多字节对象都被存储为连续的字节序列。
例如在C语言中,一个类型为int的变量x地址为0x100,那么其对应地址表达式&x的值为0x100。
且x的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。

大端字节序:在内存中,低地址存放数据的高位,高地址存放数据的低位
小端字节序:在内存中,低地址存放数据的低位,高地址存放数据的高位

例如假设上述变量x类型为int,位于地址0x100处,它的十六进制为0x01234567,地址范围为0x100~0x103字节,其内部排列顺序依赖于机器的类型。
大端法从首位开始是:0x100: 01, 0x101: 23, 0x102: 45, 0x103: 67
小端法从首位开始是:0x100: 67, 0x101: 45, 0x102: 23, 0x103: 01

------------------------大端小端测试

#include <stdio.h>
int main(void)
{
     int data = 0x12345678;
     int i;
     for(i=0; i<4; i++)
     {
          printf("%#x ----->%p\n",*((char *)&data + i),(char *)&data + i);
     }
     return 0;
}


-------------------------运行结果可以看出我的测试机是小端:
0x78 ----->0x7fff9a2bbb68
0x56 ----->0x7fff9a2bbb69
0x34 ----->0x7fff9a2bbb6a
0x12 ----->0x7fff9a2bbb6b


再来考虑这个问题:
网络上的数据流是字节流,比如一个int整数,在进行网络传输的时候,当接收端收到第一个字节的时候,它是将这个字节作为高位还是低位来处理呢?

在网络应用中,字节序是一个必须被考虑的因素,因为不同机器类型可能采用不同标准的字节序,所以均按照网络标准转化,
网络传输一般采用大端序,也被称之为网络字节序,或网络序,IP协议中定义大端序为网络字节序。

伯克利socket API定义了一组转换函数,用于16和32bit整数在网络序和本机字节序之间的转换。htonl,htons用于本机序转换到网络序;ntohl,ntohs用于网络序转换到本机序。 在主机本身就使用大端字节序时,这些函数通常被定义为空宏。


参考维基百科:https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F

你可能感兴趣的:(linux,网络)