C语言中HTON和ntohs函数的区别

C语言中HTON和ntohs函数的区别,c,sockets,unix,networking,endianness,C,Sockets,Unix,Networking,Endianness,我认为标记的问题和答案不符合我的期望链接-->-->说网络字节顺序是big-endian,主机字节顺序是little-endian。我的困惑还在继续。还有,什么是主机?仍然没有回答我的大部分问题我认为投票赞成结束的人误解了我的问题我投票赞成重新开始。请重读并重新打开问题 我读到网络字节顺序总是用Big-Endian表示的。然而,我没有找到正式的来源。我编写了一个代码片段来查看这两个函数之间的差异,但在同一台机器上,我得到了相同的结果 #include <stdio.h> int

我认为标记的问题和答案不符合我的期望链接-->-->说网络字节顺序是big-endian,主机字节顺序是little-endian。我的困惑还在继续。还有,什么是主机?仍然没有回答我的大部分问题我认为投票赞成结束的人误解了我的问题我投票赞成重新开始。请重读并重新打开问题


我读到网络字节顺序总是用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计算机输出:(PowerPC)


这是一个->主题外的多个问题。大多数人都感到困惑和不清楚->离题。看起来您不是真的没有阅读文档,就是不理解文档,可能是因为缺乏基础知识。有时候退一步看一看全貌是个好主意。附带说明:您的代码调用了未定义的行为,您使用了错误的转换类型说明符。所以它没有显示任何内容。@Toohonestforthis站点这是一个测试程序。它不需要完全便携。OP想要帮助理解
htons
ntohs
,相反,他们在评论中得到了一大堆关于他们的程序如何在一个假想的16位微控制器上出现错误的评论,该微控制器的调用约定对
无符号int
有符号int
有不同的处理。你能看出这对任何人来说都不是理想的结果吗?有几个金徽章的拥有者,如果他们觉得这个问题不是重复的,他们可以单独重新提出这个问题(他们已经在这个问题上给出了很好的建议)。我个人不打算重新打开。@snr
ntohs(12345)
将12345(在MAC上以LE格式存储)转换为2字节BE位模式,并将其扩展为4字节。问题是,代码随后将此BE位模式提供给
printf()
,该模式预期将按LE顺序接收
int
值。所以代码不是打印12345(0x3039),而是打印14640(0x3930)。一个好主意是1)将值的概念从编码中分离出来,2)使用
%x
和十六进制常量进行研究。
14640
0
14640
0
12345
12345
12345
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