c-调用htons()是否会一次又一次地更改值



我想知道我的电脑使用什么字节排序方法。因此,我尝试了一下,在将任何u_long变量转换为htons((函数后,它是否保持不变。

u_long example = 0x12345678;
printf("#%x -> #%x -> #%xn",  example, htonl(example), htonl(htonl(example)));

在测试过程中,我再次调用htons函数,再次发现htons应用的函数再次更改了值。

输出

#1234678->78563412->12345678

预期

#1234678->78563412->78563412

htons函数将所有数据排序为big-endian,为什么再次调用时数据会发生更改?怎么了?请告诉我我的错误。

htonl需要一个长的、期望的主机字节顺序,并将其转换为网络字节顺序。在主机字节顺序与网络字节顺序相反的主机上,它交换字节。再次调用它只会再次交换字节。不涉及排序,只是交换。

当您使用参数htonl(0x12345678)调用htonl时,它无法知道这四个字节的序列在网络字节顺序中意味着0x12345678。据它所知,输入可以是以主机字节顺序表示的整数0x78563412。它只是按照设计和文档进行交换,期望按主机顺序输入,并按网络字节顺序发出输出。

如果你颠覆了它记录的期望,你就不能保证会有一个有意义的结果,就像你传递了一个指向free的指针,而这个指针不是来自malloc一样。

相关内容

最新更新