网络字节序的转换函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络字节序的转换函数相关的知识,希望对你有一定的参考价值。

参考技术A

为了进行转换 bsd socket提供了转换的函数 有下面四个  htons把unsigned short类型从主机序转换到网络序  htonl 把unsigned long类型从主机序转换到网络序  ntohs 把unsigned short类型从网络序转换到主机序  ntohl 把unsigned long类型从网络序转换到主机序  在使用little endian的系统中 这些函数会把字节序进行转换  在使用big endian类型的系统中 这些函数会定义成空宏  同样 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug.

网络字节序

网络字节序


一、主机字节序

CPU对内存中数据进行存取的顺序。

1.小端字节序

一个数据的低位字节序的内容存放在低地址处,高字节序的内容存放在高地址处。
二进制比特位左边认为是高位,右边认为是低位。


由上图可见:我的CPU是小端字节序。

2.大端字节序

一个数据的低位字节序的内容存放在高地址处,高位字节序的内容存放在低地址处。

主机字节序取决于CPU架构,当下X86和X86_64架构都是小端字节序,而MIPS架构是大端字节序,字节序所针对的数据类型只有存储单位大于一个字节的数据类型,例如:short,int,long,float等,单字节存储不涉及字节序问题。

主机字节序对网络通信的影响:
两端主机字节序不同,可能导致数据二异。
解决方案:定义网络字节序为标准,不管主机是什么字节序,网络中的数据必须是网络字节序,两端主机根据自己的主机字节序进行数据转换。

二、网络字节序

网络通信中使用统一的字节序标准:网络字节序——大端字节序

网络字节序和主机字节序一样也有大小端之分,TCP/IP协议规定,网络数据流应采用大端字节序,暨低地址存高位。


判断主机字节序

int main()

	union A
	
		int a;
		char b;
	tmp;
	tmp.a = 1;
	if (tmp.b == 1)
		printf("主机为小端字节序~\\n");
	else
		printf("主机为大端字节序~\\n");

字节序转换函数

总共有四个:

以上是关于网络字节序的转换函数的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

C++socket编程,数据转为网络字节序的问题htons

第五篇:主机字节序与网络字节序的转换

网络字节序