网络字节序

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

如对四字节整数0x12345678:

网络字节序_第1张图片

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

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

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

#include
#include
#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

你可能感兴趣的:(c/c++,字节序)