您的位置:首页 > 理论基础 > 计算机网络

网络字节序

2013-09-26 21:32 190 查看
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端:网络字节序->主机自字节序(大端字节序->大端字节序)

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: