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 でした。

私は2つのことを試しました:

  1. printf("size of ip header: %hu\n", ip_header.ip_len);13312を出力しました(ビットの値が0x3400であるかのように)
  2. 構造体を 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);

今回は出力を受け取りました: size of ip header: 0 (0x00) size of ip header: 52 (0x34) これが正しい答えです。

私の質問は: 最初の印刷で何がうまくいかなかったのですか?

ありがとう

4

1 に答える 1

5

エンディアンの問題があります。プラットフォームのエンディアンが、使用しているプロトコルと同じではありません。バイトの順序を交換する必要があります。

POSIX 準拠のシステムを使用している場合は、一連ntohの関数を使用できます。

Windowsなどに相当するものがあるかどうかはわかりません。

于 2013-03-19T13:46:54.977 に答える