gpt4 book ai didi

c - 整数上 htonl() 和 ntohl() 的相同输出

转载 作者:太空狗 更新时间:2023-10-29 16:39:22 26 4
gpt4 key购买 nike

我在小端 [LE] 机器 [Linux,英特尔处理器] 上运行了以下程序。我无法解释下面代码片段中的 3 个输出。由于机器是 LE,a 的值存储为 0x78563412。打印时,它显示的是它的实际值。由于它是一台 LE 机器,我希望 ntohl() 是空操作并显示它正在执行的 0x78563412。但是,我希望 0x12345678 包含 htonl() 的第二个打印语句。有人可以帮我理解为什么它们相同吗?

int main() 
{
int a = 0x12345678;

printf("Original - 0x%x\n", (a));
printf("Network - 0x%x\n", htonl(a));
printf("Host - 0x%x\n", ntohl(a));

return 0;
}

输出:

Original - 0x12345678
Network - 0x78563412
Host - 0x78563412

最佳答案

Since its an LE machine, I expect ntohl() to be a no-op

这是错误的。网络字节顺序是big-endian,主机字节顺序是little-endian。因此,ntohlhtonl 都返回其输入的字节交换版本。

记住,htonl的要点是你可以在主机上取一个整数,然后写:

int i = htonl(a);

结果是 i 的内存,当使用网络字节顺序解释时,具有与 a 相同的值。因此,如果您将 i 的对象表示写入套接字,而另一端的读取器需要网络字节顺序的 4 字节整数,它将读取 a 的值。

and display 0x78563412

这是你打算写的吗?如果 ntohl 是一个空操作(或者更确切地说,一个身份函数),那么你的第三行必然会打印与你的第一行相同的东西,因为你会有 ntohl(a) == a 。这是 big-endian 实现中发生的情况,您的程序会打印:

Original - 0x12345678
Network - 0x12345678
Host - 0x12345678

关于c - 整数上 htonl() 和 ntohl() 的相同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11423338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com