作业帮 > 综合 > 作业

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

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/04/26 07:27:43
关于vc++里面htonl()函数的使用疑惑
#include
#include
void main()
{
struct sockaddr_in myad;
memset(&myad,0,sizeof(struct sockaddr_in));
myad.sin_family=AF_INET;
myad.sin_port=htons(4367);
myad.sin_addr.s_addr=htonl(0x40);
cout
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我,我们接着讨论