本地字节序和网络字节序
字节序指不同的CPU访问内存中多字节数据的时候,存在大小端的问题,并且一定是访问多字节数据的时候才会存在大小端的问题,如果CPU访问的是字符串,则不存在大小端的问题;
那么如何判断发送端和接收端是大端模式还是小端模式呢,首先:
●小端序(little-endian) - 低序字节存储在低地址;将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;
●大端序(big-endian)- 高序字节存储在低地址;将高字节存储在起始地址,称为“Big-Endian”字节序,由ARM、Motorola
例如有一个int型的变量:int i = 0x12345678;这里的“12”就是变量的高端,“78”就是变量的低端;
其实本地和网络字节序的转换,主要是为了不同平台之间兼容性的问题,例如两台主机要进行网络数据的传输,有两种情况(首先我们要知道,网络中传输的数据必须按网络字节序,即大端字节序;因为网络传输过程中的中间设备的处理器都是大端模式的,这是规定好的):
1.发送端是大端模式,接收端是小端模式;如果发送端不进行字节序的转换,那么这个应用程序运行到发送端是小端模式的主机上之后,网络传输就会有问题,比如说网络传输过程中的中间设备不能正确的读取收发端的IP地址和MAC地址;
2. 发送端是小端模式,接收端是大端模式;如果接收端不进行字节序的转换,而且发送端还传输了多字节的数据的话,那么这个应用程序运行到接收端是小端模式的主机上之后,接收端接收到的数据就会有问题;
因为两台设备进行网络传输,这两台设备可能不是一个平台上的CPU,不同平台上的两个CPU,它们可能两个都是大端模式的,也有可能都是小端模式的,还有可能一个是大端模式一个是小端模式或者一个是小端模式一个是大端模式,所以两台机器要进行网络传输,必须统一发送、传输和接受的模式,由此课件数据转换的主要目的就是为了保证兼容行;
当然,字节序转换函数里面已经包含了这种方法,函数本身会直接的判断当前操作系统中的CPU的大端模式还是小端模式,需要转换的话就转换,不需要转换的时候就原样输出;
下面是本地字节序到网络字节序转换的函数:
主机字