本文目录一览

1,htons htonl ntohs ntothl是什么意思有什么区别

这4个东西是用来在主机和网络之间转换字节顺序的h:hostn:network后缀s:short 16 bitl:long 32bit
你好!不知道希望对你有所帮助,望采纳。

htons htonl ntohs ntothl是什么意思有什么区别

2,htonsntohs函数使用具体请看代码

htons和ntohs实际上是两个相同的函数,如果主机与网络字节顺序不同,颠倒过来(按字节,参数是u_short,两个字节)0x1234---->0x3412否则不变。就是说htons和ntohs都是将0xabcdefgh变为0xghefcdab0xabcd变为0xcdab。

htonsntohs函数使用具体请看代码

3,htons和htonl都是把主机字节序转换成网络字节序那什么时候用

根据要转换的值是否超过16位来决定,5555转换为2进制为1 0101 1011 0011 ,为13位,所以一般用htons,当然用htonl也可以;但是如果要转换的数 转换成2进制超过16位,则只能用htonl,此时如果用htons,16位以上的数舍去,造成数据值偏差。
你好!不懂额。。不好意思啊仅代表个人观点,不喜勿喷,谢谢。

htons和htonl都是把主机字节序转换成网络字节序那什么时候用

4,htons函数没有转换成网络字节序

如果是脑筋急转弯,我猜题主用0x0000或0x1111做的测试。说正经的,题主可能这样测试:assert(htons(0x1234) == ntohs(0x1234)),因为电脑是小端字节序,因此0x1234经过htons变换后输出0x3412,ntohs(0x1234)也输出0x3412,让楼主产生了“没有进行转换”的错觉。实际情况是,两次转换都非常成功,第一次将本机的0x1234转换成网络字节序0x3412,第二次将网络序0x1234转换成本机0x3412,因此结果相同。
p->dir =1;else*temp=newnode;仿照printf("itemcode:\n");

5,网络编程端口为什么只能用htons

网络编程时,在不同的平台间传输数据时,不同平台对数据的存储方式是不一样的,如windows和Android,一个是大段模式,一个是小段模式,即高位的数据存储在高位的内存中还是地位的内存中,所以有时需要htons将主机字节顺序转换为网络字节顺序
是这样的,htonl是host to network long 的缩写,意思是将本地的int类型的字节序转化为网络字节序,注意,是long int 类型,本地是little-endian,网络是big-endian。在这里:4512的二进制形式为: (高字节)00000000 00000000 00010000 00111000(低字节)在调用htonl之后变为: (高字节)00111000 00010000 00000000 00000000(低字节)而你又用一个(ushort)将它强制转化为shoort int,这是就抛掉两个高字节于是 a 变成 00000000 00000000,你再按%d输出,自然是0了.所以,改动很简单,将htonl改为htons就可以了.

6,htons函数的问题

htons 是把你机器上的整数转换成“网络字节序”, 网络字节序是 big-endian,也就是整数的高位字节在前面。 而我们常用的 x86 CPU (intel, AMD) 电脑是 little-endian,也就是整数的低位字节放在前面。举个例子吧。假定你的port是 0x1234, 在网络字节序里 这个port放到内存中就应该显示成 addr addr+1 0x12 0x34 而在x86电脑上,0x1234放到内存中实际是: addr addr+1 0x32 0x12 htons 的用处就是把实际内存中的整数存放方式调整成“网络字节序”的方式。 再次回楼主,你的问题就是我说的, htons(4367) 后,在x86机器上,就是变成了 3857,就是因为字节序被调整了,这是正确的. 4367十六进制是0x110F,由于是little endian所以在内存中存放的是 0x0F 0x11 htons后,变成网络字节续,也就是 0x11 0x0F 这个数字如果你去看了话,就是 3857. 你debug的时候,直接去看端口的内存里的内容,就明白了。

文章TAG:htons  htons  htonl  ntohs  ntothl是什么意思有什么区别  
下一篇