Почему это объявление переменной uint16_t не работает? - PullRequest
0 голосов
/ 23 сентября 2019

Мне нужно отправить пакет от клиента udp на сервер udp (я сделал), но проблема в том, что это объявление не работает

#define RRQ 1
.
.
.

uint16_t op = htons(RRQ);

Я также пытался

uint16_t op = htons(1);

и

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

, но это не 1 в операторе, а 256

Я попытался отправить этот пакет на сервер, я получил пакет и получил тот же сервер результатовсторона (я нахожу оп == 256, а не оп == 1, как должно) Спасибо за чтение!

1 Ответ

2 голосов
/ 23 сентября 2019

Почему это объявление переменной 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
...