为什么这个 uint16_t 变量声明不起作用?
嗯,确实...
你可能在一个小端机器上,所以结果是正确的。
在一个小端机器上,内存是这样的:
uint16_t v1 = 1; --> Memory: 0x01 0x00
uint16_t v256 = 256; --> Memory: 0x00 0x01
在网络顺序中,它就像:
uint16_t v1 = 1; --> Memory: 0x00 0x01
uint16_t v256 = 256; --> Memory: 0x01 0x00
所以k
有1
内存中的值0x01 0x00
然后op
将分配k
转换为网络顺序,因此在内存中它将是0x00 0x01
。
当您在主机上将其打印为 auint16_t
时,您将看到结果 256。
这个小程序说明了正在发生的事情:
#include <stdio.h>
#include <inttypes.h>
#include <arpa/inet.h>
int main()
{
uint16_t k = 1;
unsigned char* p = (unsigned char*)&k;
printf("k=%hd\n", k);
for (size_t i = 0; i<sizeof k; ++i)
{
printf("%02X\n", *p++);
}
uint16_t op = htons(k);
unsigned char* pop = (unsigned char*)&op;
printf("op=%hd\n", op);
for (size_t i = 0; i<sizeof op; ++i)
{
printf("%02X\n", *pop++);
}
return 0;
}
输出:
k=1
01
00
op=256
00
01