c语言 - 为什么这个uint16_t变量声明不起作用?



我必须将一个包从 udp 客户端发送到 udp 服务器(我做的(,但问题是这个声明不起作用

#define RRQ 1
.
.
.
uint16_t op = htons(RRQ);

我也试过

uint16_t op = htons(1);

int k = 1;
uint16_t op = htons(k);

但这并没有把 1 放在 OP 中,而是 256

我尝试将此包发送到服务器,我收到了该包,并且得到了相同的结果服务器端(我发现 op == 256 而不是 op == 1( 感谢您的阅读!

为什么这个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

当您将其打印为主机上的uint16_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=%hdn", k);
for (size_t i = 0; i<sizeof k; ++i)
{
printf("%02Xn", *p++);
}
uint16_t op = htons(k);
unsigned char* pop = (unsigned char*)&op;
printf("op=%hdn", op);
for (size_t i = 0; i<sizeof op; ++i)
{
printf("%02Xn", *pop++);
}
return 0;
}

输出:

k=1
01
00
op=256
00
01

最新更新