为什么这个uint16_t变量声明不起作用?

时间:2019-09-23 18:32:07

标签: c serialization udp uint16

我必须将包从udp客户端发送到udp服务器(我制造),但问题是此声明不起作用

#define RRQ 1
.
.
.

uint16_t op = htons(RRQ);

我也尝试过

uint16_t op = htons(1);

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

但这不会在op中放入1,而是256

我尝试将此程序包发送到服务器,我收到该程序包,并在服务器端得到相同的结果(我发现op == 256而不是op == 1,就像应该的那样) 感谢您的阅读!

1 个答案:

答案 0 :(得分:2)

  

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