4

私のUbuntuディストリビューションのip.hファイルには、以下にコピーされた次の構造体iphdrがあります。変数 ihl と version の順序がバイト順によって変わる理由を誰でも説明できますか? 私の理解によると、複数のバイトがある場合は「エンディアン」が重要になりますが、この場合、これらの 2 つ (ihl とバージョン) を組み合わせて 1 バイトを作成します。したがって、リトル エンディアンまたはビッグ エンディアンであっても、バイト内のビットの順序付けには影響しません。

struct iphdr
  {
#if __BYTE_ORDER == __LITTLE_ENDIAN
    unsigned int ihl:4;
    unsigned int version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
    unsigned int version:4;
    unsigned int ihl:4;
#else
# error "Please fix <bits/endian.h>"
#endif
    u_int8_t tos;
    u_int16_t tot_len;
    u_int16_t id;
    u_int16_t frag_off;
    u_int8_t ttl;
    u_int8_t protocol;
    u_int16_t check;
    u_int32_t saddr;
    u_int32_t daddr;
    /*The options start here. */
  };
4

1 に答える 1

4

これは実装(psABI-)固有ですが、実際には、関連する実装では、バイトまたはワード内のビットフィールドのビット順序がワード内のバイトのバイト順序と一致します。したがって、これらのメンバーが使用されているシステムのタイプに関係なく同じビット位置を占めるために、それらの順序はエンディアンに基づいて交換されます。

于 2013-03-15T21:46:31.980 に答える