Тип печати uint16_t

Я читаю файл в двоичном режиме следующим образом:

fread(&pcap_header      ,sizeof(pcap_hdr_t      ),  1 , pFile);
fread(&pcaprec_header   ,sizeof(pcaprec_hdr_t   ),  1 , pFile);
fread(&ether_header     ,sizeof(ethernet_hdr_t  ),  1 , pFile);
fread(&ip_header        ,sizeof(ip_hdr_t        ),  1 , pFile);
fread(&tcp_header       ,sizeof(tcp_header_t    ),  1 , pFile);
fread(&modbus_header    ,sizeof(modbus_header_t ),  1 , pFile);

в то время как все переменные выше определены как тип в функции sizeof() рядом с ней. Я пытаюсь извлечь определенную часть файла и распечатать его. размер этой части равен 16 битам и определяется следующим образом:

uint16_t     ip_len;

внутри типа "ip_hdr_t". Я посмотрел на WireShark и увидел реальное значение этих 16 битов, и это 0x0034.

Я попробовал две вещи:

  1. printf("size of ip header: %hu\n", ip_header.ip_len); который напечатал 13312 (как если бы значение битов было 0x3400)
  2. разделите структуру на две 8-битные переменные:uint8_t ip_len; uint8_t ip_len2;и распечатать его отдельно: printf("size of ip header: %hu\n", ip_header.ip_len); printf("size of ip header: %hu\n", ip_header.ip_len2);

на этот раз я получил вывод: размер заголовка ip: 0 (0x00) размер заголовка ip: 52 (0x34), что является правильным ответом.

мой вопрос: что пошло не так в первом отпечатке?

Спасибо

1 ответ

Решение

У вас проблема с порядком байтов; ваша платформа не имеет той же последовательности, что и используемый вами протокол. Вам необходимо обменять порядок байтов.

Если вы используете POSIX-совместимую систему, вы можете использовать ntoh семейство функций.

Я не уверен, есть ли аналог, например, для Windows.

Другие вопросы по тегам