Тип печати uint16_t
Я читаю файл в двоичном режиме следующим образом:
fread(&pcap_header ,sizeof(pcap_hdr_t ), 1 , pFile);
fread(&pcaprec_header ,sizeof(pcaprec_hdr_t ), 1 , pFile);
fread(ðer_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.
Я попробовал две вещи:
printf("size of ip header: %hu\n", ip_header.ip_len);
который напечатал 13312 (как если бы значение битов было 0x3400)- разделите структуру на две 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.