IP バージョンを出力したい生のイーサネット パケットへのポインタがあります。Linux クライアントで C++ を使用しています。
IP バージョンは、IHL (インターネット ヘッダー長) と共にパケット ヘッダーの 14 番目のバイトに格納されます。IP ヘッダーのすべてのフィールドを出力する機能がありますが、IP バージョンは IHL と一緒に 14 バイト目に格納されているため、14 バイト目の最初の 4 ビットを出力する必要があり、これを行う方法がわかりません。IP バージョンと IHL の両方を印刷したい。
私の機能は次のようになります:
int PrintIPHeader(unsigned char *eth_head)
{
unsigned char *ip_head = eth_head;
int j;
printf("---Start of IP Header---");
printf("\nVersion\n");
for(j = 0; j < 1; j++)
{
printf("%d", *(ip_head+j));
}
printf("\nIHL\n");
for(j = 0; j < 1; j++)
{
printf("%d", *(ip_head+j));
}
printf("\nToS\n");
for(j = 1; j < 2; j++)
{
printf("%d", *(ip_head+j));
}
printf("\nTotal Length\n");
for(j = 2; j < 4; j++)
{
printf("%d", *(ip_head+j));
}
...
and so and so on with all the fields of an IP header
(I know the for-loop is unnecessary in some of the cases)
}
上記のメソッドはバイト全体を出力しますが、最初の 4 ビットのみを出力してから、最初のバイトの最後の 4 ビットを出力する別の「printf」が必要です。上記のメソッドでは、ヘッダーの 14 番目のバイトを引数として解析します。
以下を使用して最初の 4 ビット 4 桁を切り替え、それによって IHL を上書きできると言われましたが、これは私が望んでいるものではありません。
printf(ip_head[14] >> 4);
しかし、「型 'unsigned char *' および 'int' からバイナリ 'operator>>' へのオペランドが無効です」というエラーが表示されます。
誰かが解決策を得ましたか?