C语言中htons和ntohs函数之间的区别

时间:2018-08-02 16:27:18

标签: c sockets unix networking endianness

我认为标记的问题和答案不符合我的期望。链接-> Same output for htonl() and ntohl() on an integer->说,网络字节顺序为大端,主机字节顺序为小尾数。我的困惑仍在继续。另外,什么是主机?仍然不能回答我的大多数问题。 我认为那些投票赞成关闭问题的人误解了我的问题 我投票赞成重新开放的问题 。请重新阅读并重新打开问题。


我已经阅读到,网络字节顺序始终以Big Endian表示。但是,我没有找到正式的消息来源。我做了一个片段,以查看这两个功能之间的差异,但是在同一台计算机上我得到了相同的结果。

#include <stdio.h>

int main() {
    //first part
    printf("%d\n", ntohs(12345));
    printf("%d\n", ntohs(12345) == 12345);
    // second part
    printf("%d\n", htons(12345));
    printf("%d\n", htons(12345) == 12345);
    //third part
    printf("%d\n", htons(htons(12345)));
    printf("%d\n", ntohs(ntohs(12345)));
    //fourth part
    printf("%d\n", ntohs(htons(12345)));
    return 0;
}
  • 如果网络字节顺序始终以Big Endian表示,为什么不能 我在第二部分中将打印的值读为12345吗? tl; dr我的机器是 小端。

我还在与Big Endian一起使用的PowerPC上尝试了相同的代码后,第一部分和第二部分给出的结果都是12345。由于机器的表示,它并不有趣。

  • 第三部分呢?是De Morgan(双关语!)?它产生相同 第四部分的结果。那么,如果两个函数都执行相同的操作,我们为什么需要 任务?
  • 在这种情况下,“ 主机”是什么意思?我的机器吗?
  • 尽管我可以使用这些功能来检查一台机器是否 使用小端或大端。但是,听起来并不理智 错综复杂之后。

Little-Endian计算机输出:(Mac OSX)

14640
0
14640
0
12345
12345
12345

大端计算机输出:(PowerPC)

root@debian-powerpc:~# gcc -c endian.c 
root@debian-powerpc:~# gcc endian.c -o  out 
root@debian-powerpc:~# ./out 
12345
1
12345
1
12345
12345
12345

0 个答案:

没有答案