4

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

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 header 的大小:0 (0x00) ip header 的大小:52 (0x34),这是正确的答案。

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

谢谢

4

1 回答 1

5

你有一个字节顺序问题;您的平台与您使用的协议不具有相同的字节顺序。您需要交换字节的顺序。

如果您使用的是 POSIX 兼容系统,则可以使用ntoh函数族

我不确定是否有适用于 Windows 的等价物。

于 2013-03-19T13:46:54.977 回答