网络字节序

来源:互联网 发布:拍水下婚纱价格知乎 编辑:程序博客网 时间:2024/05/16 12:27

1、字节序:分为大端字节序和小段字节序


    a、大端字节序(Big Endian)
        最高有效位(MSB:Most Significant Bit)存储于最低内存地址处,最低有效位(LSB:Lowest Significant Bit)存储于最高内存地址处。

   例如:数据16进制数据:0x12345678,在内存中存放形式如下: 12 34 56 78

(其中 0x12为高位数据 。。。。0x78为低位数据)


    b、小端字节序(Little Endian)
       最高有效位(MSB:Most Significant Bit)存储于最高内存地址处,最低有效位(LSB:Lowest Significant Bit)存储于最低内存地址处。

   例如:数据16进制数据:0x12345678,在内存中存放形式如下: 78 56 34 12

(其中 0x12为高位数据 。。。。0x78为低位数据)


2、主机字节序
   不同的主机有不同的字节序,如x86为小端字节序,Motorola 6800为大端字节序,ARM字节序是可配置的。
 
3、 网络字节序

   网络字节序规定为大端字节序

如何验证x86平台下的字节序?

 

代码如下:

//file:01byteorder

#include<stdio.h>
#include<arpa/inet.h>
int main()
{

unsigned int x=0x12345678;
unsigned char *p=(unsigned char*)&x;
printf("x86字节序:");
printf("%0x %0x %0x %0x\n",p[0],p[1],p[2],p[3]);
unsigned int y=htonl(x);
printf("主机字节序->网络字节序:");
p=(unsigned char*)&y;
printf("%0x %0x %0x %0x\n",p[0],p[1],p[2],p[3]);
unsigned int z=ntohl(y);
printf("网络字节序->主机字节序:");
p=(unsigned char*)&z;
printf("%0x %0x %0x %0x\n",p[0],p[1],p[2],p[3]);
return 0;
}

则我们的预期目标是:78  56  34 12 ,那么x86为小端字节序:

 

 

综上所属:不同的硬件平台字节序是不一样的,这就需要字节序的转化

          例如:电脑A和手机B进行通信,则需要如下转化

                   A端:主机字节序->网络字节序(小端字节序->大端字节序)

                  B端:网络字节序->主机自字节序(大端字节序->大端字节序)