ntohs() 可以应用于 uint8_t

can ntohs() apply on uint8_t

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 架构,Intel

提前感谢您的回答。

在小端机器上,0 是预期的输出。在大端机器上,它将输出 9.

var,其值为0x09,传给ntohs时,首先提升为uint16_t,即参数的类型,所以参数有值0x0009。转换后,函数returns将值0x0900作为类型uint16_t

然后将此值分配给 uint8_t,但值 0x0900 超出了 运行ge。然后通过基本上只使用值的最低位字节将其转换为较小的值,即 0。

如果您 运行 在大端机器上使用相同的代码,ntohs 函数基本上什么都不做,并且 returns 与它被赋予的值相同,在本例中为 9。

您的问题是 varuint8_tntohs 的签名是 uint16_t ntohs(uint16_t netshort);,这意味着它返回一个 16 位 int,然后存储在一个 8 位 int 中。

当您将 var 传递给 ntohs 时,您的 8 位 int 将提升为 16 位 int。你的机器是小字节序的,因此作为 16 位 int,9 是 0x0009ntohs 将其参数解释为网络顺序 16 位 int,因此它读取 0x0009 为 2304。然后它尝试将其转换为小端顺序,因为您的机器是小端。

在小端中,23040x0900ntohs 然后 returns 这个,但是 var 只有 8 位长,所以它砍掉了左边的字节,因此存储 0x00。这解释了为什么您得到 0 作为输出。

如果您将 var 更改为 uint16_t,您应该会按预期得到 2304

你永远不会得到 9 除非你在大端机器上 运行。