主机字节序+网络字节序

转载 2015年11月17日 15:54:20

什么是字节序?是指整数在内存中保存的顺序。
      字节序有两种:
      a.Little endinan 低位存储在内存的低地址,高位存储在内存的高地址;
      b.Big endian 高位存储在内存的低地址,低位存储在内存的高地址;

 

      举个简单的例子:
DWORD dwCount = 0x01020304;这样的一个双字节变量在内存中如下分布0013FF70  04 03 02 01
(注:实验结果取之 XPSP3 VC6.0,说明我的机器是Little endinan序)
而如果是Big endian序的话,应该是0013FF70  01 02 03 04。用的比较多的x86系列的CPU,都是Little endinan序的。

 

      而网络字节序这是TCP/IP协议中定义好的一种数据表示格式,它是与你的机器的cpu,操作系统什么的无关的,这样可以保证数据在网络中传输时,不管怎么样都能正确的解释了,网络字节序选择了Big endian。这样就给编写网络程序的程序员带来一个问题,程序员必须把本地数据从主机字节序转换成网络字节序发送到主机,同时,主机也必须把收到的数据从网络字节序转换成本地字节序,这样才能保证双方正确的收发数据,不然就是产生bug。

      winapi提供了四个函数用于进行网络字节序到本机字节序和本机字节序到网络字节序的转换:
htons:把unsigned short类型从主机序转换到网络序
htonl:把unsigned long类型从主机序转换到网络序
ntohs:把unsigned short类型从网络序转换到主机序
ntohl:把unsigned long类型从网络序转换到主机序
(这四个API可以这样记,s表示short,l表示long,n表示network,h表示host)

      另外:char类型是没有字节序的问题的,只有大于一个字节的数据类型才有字节序的问题。很多翻译书籍将Little endinan翻译成小端模式,将Big endian翻译成大端模式。

相关文章推荐

WinSock网络编程学习(三)判断主机字节序程序

什么是“字节序”? 在计算机网络中,通信是基于信息流的,不管是有线通信还是无线通信,那么数据在通道上传输时,就需要考虑一个问题:数据在传输时,正确的字节顺序是怎样的?收到的时候又该以怎样的顺序去解读...

网络字节序和主机字节序

  • 2011年03月30日 20:31
  • 27KB
  • 下载

判断主机字节序大小端

  • 2013年09月04日 14:24
  • 198B
  • 下载

网络字节序和主机字节序相互转换函数

#include unit16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t host32bitvalue); //均返回网络...

php主机字节序和网络字节序

使用php编写socket程序时,也需要注意主机字节序和网络字节序的转换 主机字节序就是我们平常说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序 这个叫做...
  • sole_cc
  • sole_cc
  • 2016年07月24日 22:01
  • 915

主机字节序和网络字节序

1       字节序 由于不同的计算机系统采用不同的字节序存储数据,同样一个4字节的32位整数,在内存中存储的方式就不同. 字节序分为小尾字节序(Little Endian)和大尾字节序(Big ...

网络字节序 主机字节序 转换

在对IP地址结构体SOCKADDR_IN赋值的时候,经常会用到下列的函数htonl,htons,inet_addr,与之相对应的函数是ntohl,ntohs,inet_ntoa。查看这些函数的解析,会...

网络字节序与主机字节序的转换~!~~~

在对IP地址结构体SOCKADDR_IN赋值的时候,经常会用到下列的函数htonl,htons,inet_addr,与之相对应的函数是ntohl,ntohs,inet_ntoa。查看这些函数的解析,会...

主机字节序与网络字节序的转换过程

主机字节序与网络字节序的转换过程
  • an_tang
  • an_tang
  • 2017年05月29日 17:13
  • 693
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:主机字节序+网络字节序
举报原因:
原因补充:

(最多只允许输入30个字)