ntohs()可以应用于uint8_t吗

时间:2018-07-26 16:33:07

标签: c byte endianness

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架构,英特尔

非常感谢您的回答。

2 个答案:

答案 0 :(得分:1)

在小字节序计算机上,预期输出为0。在大型字节序计算机上,它将输出9。

当将值为0x09的var传递给ntohs时,它首先被提升为参数类型的uint16_t,因此参数的值为0x0009。转换后,函数将返回值0x0900,类型为uint16_t

然后将该值分配给uint8_t,但值0x0900超出范围。然后,只需使用该值的最低字节0即可将其转换为较小的值。

如果您在big-endian机器上运行相同的代码,则ntohs函数基本上不执行任何操作,并返回给定的值,在这种情况下为9。

答案 1 :(得分:0)

您的问题是varuint8_tntohs的签名为uint16_t ntohs(uint16_t netshort);,表示它返回的是16位整数,然后将其存储在8位整数中。

当您将var传递给ntohs时,您的8位整数将提升为16位整数。您的计算机是低位字节序,因此,由于16位int,9为0x0009ntohs将其自变量解释为16位int网络顺序,因此将0x0009读为2304。然后它尝试将其转换为小端顺序,因为您的计算机是小端顺序。

在小尾数法中,23040x0900ntohs然后返回此值,但是var只有8位长,因​​此它将左字节切掉,因此存储了0x00。这解释了为什么输出为0的原因。

如果将var更改为uint16_t,则应按预期取出2304

除非您在大型字节序计算机上运行,​​否则您永远不会退出9