网络字节序

来源:互联网 发布:windows系统占有率 编辑:程序博客网 时间:2024/06/10 21:59

字节序指计算机内存或网络传输中数据的存储顺序,对于多字节数据,当低位存储在低字节则称为“小端存储”,当低位存储在高位则称为大端存储。

如对四字节整数0x12345678:


数据在网络中传输时,首先需要将发送端的主机字节序转换为网路字节序,并在接收端将网络字节序转换成主机字节序。网络字节序都是大端存储,而主机字节序与CPU架构相关。

 可以使用如下函数实现网络字节序到主机字节序的转换:

htons():主机字节序转换成网络字节序(h:host,n:network,s:short
htonl()
:主机字节序转换成网络字节序 (h:host,n:network,l:long)
ntohs():网络字节序转换成本地字节序;
ntohl():网络字节序转换成本地字节序;

#include<stdio.h>#include<winsock.h>#pragma comment(lib, "ws2_32.lib")using namespace std;int main(){unsigned long a = 0x12345678;unsigned char*p = (unsigned char*)(&a);printf("%x,%x,%x,%x\n",p[0],p[1],p[2],p[3]);unsigned long b = htonl(a);//主机字节序->网络字节序p = (unsigned char*)(&b);printf("%x,%x,%x,%x\n",p[0],p[1],p[2],p[3]);unsigned long c = ntohl(b);p = (unsigned char*)(&c);//网络字节序->主机字节序printf("%x,%x,%x,%x\n",p[0],p[1],p[2],p[3]);return 0;}


事实上,当想计算机输入一串字节数时,当确定了数据的字节序,只要将字节重排即可得到

数据真实值:


/*大端字节序 */

i = (data[3]<<0)|(data[2]<<8)|(data[1]<<16)|(data[0]<<24);

 

/*小端字节序 */

i = (data[0]<<0)|(data[1]<<8)|(data[2]<<16)|(data[3]<<24);

 

 参考:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms738557(v=vs.85).aspx

http://www.ruanyifeng.com/blog/2016/11/byte-order.html

0 0
原创粉丝点击