6

以下は、Linux マシン上のライブラリの IP 構造です。

   struct ip
      {
    #if __BYTE_ORDER == __LITTLE_ENDIAN
        unsigned int ip_hl:4;               /* header length */
        unsigned int ip_v:4;                /* version */
    #endif
    #if __BYTE_ORDER == __BIG_ENDIAN
        unsigned int ip_v:4;                /* version */
        unsigned int ip_hl:4;               /* header length */
    #endif
        u_int8_t ip_tos;                    /* type of service */
        u_short ip_len;                     /* total length */
        u_short ip_id;                      /* identification */
        u_short ip_off;                     /* fragment offset field */
    #define IP_RF 0x8000                    /* reserved fragment flag */
    #define IP_DF 0x4000                    /* dont fragment flag */
    #define IP_MF 0x2000                    /* more fragments flag */
    #define IP_OFFMASK 0x1fff               /* mask for fragmenting bits */
        u_int8_t ip_ttl;                    /* time to live */
        u_int8_t ip_p;                      /* protocol */
        u_short ip_sum;                     /* checksum */
        struct in_addr ip_src, ip_dst;      /* source and dest address */
      };

これらの行について:

    #if __BYTE_ORDER == __LITTLE_ENDIAN
        unsigned int ip_hl:4;               /* header length */
        unsigned int ip_v:4;                /* version */
    #endif
    #if __BYTE_ORDER == __BIG_ENDIAN
        unsigned int ip_v:4;                /* version */
        unsigned int ip_hl:4;               /* header length */
    #endif

なぜバイト内でエンディアンが重要なのですか? エンディアンはマルチバイト整数にのみ影響すると思いますが、エンディアンはバイト内のビット配置にも影響するように思えますか?

その上、それは 1 バイトだけです。なぜなら、unsigned int4 バイトです。

Wireshark で、ip_v と ip_hl が0x45 IP パケットをキャプチャした場合に表示されることに気付きました。最初のバイトは ip_v と ip_hl で構成されています 文字変数に入れましたx

の結果はx & 0b11110000何ですか?エンディアンに関係なく常に4ですか、それとも5かもしれませんか?

4

2 に答える 2

3

複数バイトデータの場合に関連するバイト順序があります。しかし、あなたの場合、重要なのはbit field ordering、単一バイトデータの場合のビットの順序を扱う です。ビット フィールドの順序付けに関して、C 標準によって提唱された規則はありません。これは実装に依存し、コンパイラによって決定されます。

変数のサイズが 4 バイトではありません。わずか4ビットです。それらは独立変数ではありません。これらは、構造体内のビット フィールドです。

于 2013-05-16T00:58:47.707 に答える