int main()
{
uint8_t var = 9;
var = ntohs(var);
printf("var=%u",var)
}
这段代码在Little Endian中产生的var值为0,但是在Big Endian中9成为可能的答案。
根据我的猜测,由于我们无法对1字节的文件应用ntohs!我们可以吗?有没有情况?
我的linux机器是Little Endian,x86架构,英特尔
非常感谢您的回答。
答案 0 :(得分:1)
在小字节序计算机上,预期输出为0。在大型字节序计算机上,它将输出9。
当将值为0x09的var
传递给ntohs
时,它首先被提升为参数类型的uint16_t
,因此参数的值为0x0009。转换后,函数将返回值0x0900,类型为uint16_t
。
然后将该值分配给uint8_t
,但值0x0900超出范围。然后,只需使用该值的最低字节0即可将其转换为较小的值。
如果您在big-endian机器上运行相同的代码,则ntohs
函数基本上不执行任何操作,并返回给定的值,在这种情况下为9。
答案 1 :(得分:0)
您的问题是var
是uint8_t
。 ntohs
的签名为uint16_t ntohs(uint16_t netshort);
,表示它返回的是16位整数,然后将其存储在8位整数中。
当您将var传递给ntohs
时,您的8位整数将提升为16位整数。您的计算机是低位字节序,因此,由于16位int,9为0x0009
。 ntohs
将其自变量解释为16位int网络顺序,因此将0x0009
读为2304。然后它尝试将其转换为小端顺序,因为您的计算机是小端顺序。
在小尾数法中,2304
是0x0900
。 ntohs
然后返回此值,但是var
只有8位长,因此它将左字节切掉,因此存储了0x00
。这解释了为什么输出为0的原因。
如果将var
更改为uint16_t
,则应按预期取出2304
。
除非您在大型字节序计算机上运行,否则您永远不会退出9
。