0

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>>' へのオペランドが無効です」というエラーが表示されます。

誰かが解決策を得ましたか?

4

1 に答える 1