打印uint16_t类型

时间:2013-03-19 13:45:29

标签: c printf uint16

我正在以这种方式读取二进制模式的文件:

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);
  3. 这次我收到了输出:ip header的大小:0(0x00) ip header的大小:52(0x34) 这是正确的答案。

    我的问题是:第一次印刷出了什么问题?

    由于

1 个答案:

答案 0 :(得分:5)

您有endianness个问题;您的平台与您正在使用的协议没有相同的字节顺序。您需要交换字节的顺序。

如果您使用的是POSIX兼容系统,则可以使用ntoh family of functions

我不确定是否有例如视窗。