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。
您的问题是 var
是 uint8_t
。 ntohs
的签名是 uint16_t ntohs(uint16_t netshort);
,这意味着它返回一个 16 位 int,然后存储在一个 8 位 int 中。
当您将 var 传递给 ntohs
时,您的 8 位 int 将提升为 16 位 int。你的机器是小字节序的,因此作为 16 位 int,9 是 0x0009
。 ntohs
将其参数解释为网络顺序 16 位 int,因此它读取 0x0009
为 2304。然后它尝试将其转换为小端顺序,因为您的机器是小端。
在小端中,2304
是 0x0900
。 ntohs
然后 returns 这个,但是 var
只有 8 位长,所以它砍掉了左边的字节,因此存储 0x00
。这解释了为什么您得到 0 作为输出。
如果您将 var
更改为 uint16_t
,您应该会按预期得到 2304
。
你永远不会得到 9
除非你在大端机器上 运行。
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。
您的问题是 var
是 uint8_t
。 ntohs
的签名是 uint16_t ntohs(uint16_t netshort);
,这意味着它返回一个 16 位 int,然后存储在一个 8 位 int 中。
当您将 var 传递给 ntohs
时,您的 8 位 int 将提升为 16 位 int。你的机器是小字节序的,因此作为 16 位 int,9 是 0x0009
。 ntohs
将其参数解释为网络顺序 16 位 int,因此它读取 0x0009
为 2304。然后它尝试将其转换为小端顺序,因为您的机器是小端。
在小端中,2304
是 0x0900
。 ntohs
然后 returns 这个,但是 var
只有 8 位长,所以它砍掉了左边的字节,因此存储 0x00
。这解释了为什么您得到 0 作为输出。
如果您将 var
更改为 uint16_t
,您应该会按预期得到 2304
。
你永远不会得到 9
除非你在大端机器上 运行。