关于vc++里面htonl()函数的使用疑惑

关于vc++里面htonl()函数的使用疑惑,第1张

htonl就是把本机字节顺序转化为网络字节顺序

所谓网络字节顺序(大尾顺序)就是指一个数在内存中存储的时候“高对低,低对高”(即一个数的高位字节存放于低地址单元,低位字节存放在高地址单元中)。但是计算机的内存存储数据时有可能是大尾顺序或者小尾顺序。

先举个例子:

int a = 0x403214

int b = htonl(a)

我在VC++6.0调试这段代码,发现

&a的值为:0x0012ff44

其中0x0012ff44、0x0012ff45、0x0012ff46、0x0012ff47这四个单元的值依次为:14、32、40、00,即0x403214这个数的高位部分存放在高位地址中,低位部分存放在低位地址中,即小尾顺序。

&b的值为:0x0012ff40

其中0x0012ff40、0x0012ff41、0x0012ff42、0x0012ff43这四个单元的值依次为:00、40、32、14,即把原数0x403214的高位部分存放在低位地址中,低位部分存放在高位地址中。

由此可见,如果一个数以小尾顺序存储,经htonl函数调用后这个数的高地位字节会完全颠倒过来成为一个新的数。这个新的数在机器内部其实还是以小尾顺序存储的,但是相对于原来的数而言相当于是变成大尾顺序的了。

long型的0x40写完整为:0x 00 00 00 40,共四个字节,调用htonl后四个字节颠倒顺序,为0x 40 00 00 00。

同样,0x40 00 00 00调用htonl后变为0x 00 00 00 40,即0x40

如果我的回答有问题,可以HI我,我们接着讨论

htonl函数,是将主机端一个无符号长整数转换为TCP/IP协议网络的大端(big endian)格式的字节序列!

ntohl函数正好相反!

这两个函数多用于使用Intel处理器的主机,因为Intel处理器使用小端数据格式(little endian)!而TCP/IP协议网络是用大端(big endian)格式的!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11446610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存