博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络字节序
阅读量:2427 次
发布时间:2019-05-10

本文共 2000 字,大约阅读时间需要 6 分钟。

网络字节序

一.字节序

       字节序是由于不同的主处理器和操作系统,对大于一个字节的变量在内存中的存放顺序不同而产生的。

       字节序通常有大端字节序列和小端字节序两种分类方法。

        由于主机的千差万别,主机的字节序不能做到统一,但是网络上传输的数值,它们有统一的规定。网络字节序:是指多字节变量在网络传输时的表示方法,网络字节序采用高端字节序的表示方法

二.大端字节序和小端字节序

    字节序是由于CPU和OS对多字节变量的内存存储顺序不同而产生的。

1.brief introduce:

    一个16位的整数,它由两个字节构成,在有的系统上会将高字节放在内存的低地址上,而有的系统上则将高字节放在内存的高地址上,所以存在字节序的问题。

2.字节序的表示方法有两种:

1>小端字节序(Little Endian):在表示变量的内存起始地址存放底字节,高字节顺序存放

2>大端字节序(Big Endian):在表示变量的内存起始地址存放高字节,底字节顺序存放。

3实例:

一个变量的值为0xabcd,在大端字节序和小端字节序的系统中两者的存放顺序是不同的.

1>在小端字节系统中的存放顺序如图:

0xab在地址15~8的地址上,而0xcd在地址7~0的位置上。

2>在大端字节序系统中的存放顺序如图:

4.程序实例:

可以编写程序来检测下变量在内存中的表示形式,以确定系统中的字节序为大端字节序还是小端字节序。

(1)字节序结构:

程序先建立一个公用体类型address,用于测试字节序,成员value是int 类型变量,可以通过成员byte来访问value变量的高字节和低字节。

typedef union{

   unsigned  int value;

   unsigned  char byte[2];

}addr;

(2)变量声明,声明一个to类型的变量typeordr,给变量value赋值为0xabcd,由于在类型addr中,value和byte成员共享同一块内存,所以可以通过byte的不同成员来访问value的高字节和低字节。

(3)程序:

int main(int argc,char *argv)

{

      addr  typeorder;//一个to类型的变量

      typeorder.value= 0xabcd;

      /*小端字节序检查*/

       if(typeorder.byte[0] == 0xcd &&typeorder.byte[1]==0xab){

        printf(“Low endian bye order\n”);

        printf(“byte[0]:0x%x,byte[1]:0x%x\n”,typeorder.byte[0],typeorder.byte[1]);          

         }

           /*大端字节序判断*/

          if(typeorder.byte[0] == 0xab &&typeorder.byte[1]==0xcd){

          printf(“High endian byte order\n”);

            printf(“byte[0]:0x%x,byte[1]:0x%x\n”,typeorder.byte[0],typeorder.byte[1]);

           }

          return 0;

}

5.进行网络字节序转换的函数有htons,htonl,ntohs(),ntohl()等,其中s表示short数据类型,l是long数据类型的意思,h是host既主机的意思,n是network即网络的意思。

1>htons(host to net short):表示对short类型的变量,从主机字节序转换为网络字节序。

2>ntohs(net to host short):表示对short类型的变量,从网络字节序转换为主机字节序。

3>htonl(host to net long):表示对long类型的变量,从主机字节序转换为网络字节序

4>ntohl(net to host long):表示对long类型的变量,从网络字节序转换为主机字节序。

6.由于在网络中网络字节序采用高端字节序的表示方法。因此字节序转换函数在不同平台上的实现是不同的,在小端主机字节序的平台要进行转换,而在大端主机字节序的平台上是不需要进行转换的。

例如:通过下面的实现方式可以兼容不同的平台:

#if  ISLE

/*小端字节序平台调用此部分代码*/

long  htonl(longvalue)

{

Return ((value << 24) |  ((value <<8)&0x00ff0000) |((value>>8)&0x0000ff00)|(value>>24));

}

#else if  ISBE

/*大端字节序平台调用此部分代码*/

long  htonl(longvalue)

{

      /*由于字节序一致,不需要进行转换*/

      return  value;

}

#endif

 

转载地址:http://uddmb.baihongyu.com/

你可能感兴趣的文章
笑死!996 程序员竟然做了这个梦!| 每日趣闻
查看>>
“再见,微软!”
查看>>
ARM 发布新一代 CPU 和 GPU,实现 20% 性能提升!
查看>>
技术引路:机器学习仍大有可为,但方向在哪里?
查看>>
漫画:如何给女朋友解释什么是编译与反编译
查看>>
刷屏了!这篇 Python 学习贴,90% 的程序员都用的上!
查看>>
漫画:如何给女朋友解释什么是适配器模式?
查看>>
程序员又迎来一个好消息! | 每日趣闻
查看>>
Mac 被曝存在恶意漏洞:黑客可随意调动摄像头,波及四百万用户!
查看>>
拒绝与其他码农一致!CSDN定制T让你成为最靓的仔
查看>>
程序员情商低?看完这 4 类程序员我懂了!
查看>>
《长安十二时辰》里你不能不知道的 IT 技术 | 每日趣闻
查看>>
程序员爬取 3 万条评论,《长安十二时辰》槽点大揭秘!
查看>>
一年参加一次就够,全新升级的 AI 开发者大会议程出炉!
查看>>
基于 XDanmuku 的 Android 性能优化实战
查看>>
基于嵌入式操作系统的物联网安全
查看>>
一个只有 99 行代码的 JS 流程框架
查看>>
移动周刊第 186 期:移动 App 客户端性能优化、iOS 开源库源码解析
查看>>
包学会之浅入浅出 Vue.js:开学篇
查看>>
JavaScriptCore 全面解析 (上篇)
查看>>