网络字节序和本机字节序的思考

时间:2022-09-26 15:38:45

看下面一段程序:

#include <stdio.h>
#include <arpa/inet.h>

int main(int argc, char* argv[])
{
	struct in_addr m;
	//2237180096
	m.s_addr=0x8558a8c0;	//133 88 168 192
	printf("%u\n", m.s_addr );
	printf("%s\n", inet_ntoa(m));

	unsigned short t=0x0908; //2312
	printf("%hu\n",t);
	unsigned short s=ntohs(t);
	printf("%hu\n",s);
	
	return 0;
}

输出结果:

网络字节序和本机字节序的思考

首先s_addr是unsigned int类型,使用inet_ntoa转换时先判断本机的字节序位网络字节序(假如本地字节序是大端存储,就不用转),就是0x8558a8c0修改成0xc0a85885,每一个字节对应ipv4的一个段,如下:
c0           a8          58       85
192        168        88       133
ntohs不检查参数的字节序,只检查本地字节序是否和网络字节序一致。
ntohs()函数会先判断本地字节序,如果是小端存储(和大端字节序相反),就进行转换;如果是大端字节序就不进行转换。