2

最近、ネットワーク通信の両側のエンディアンが異なる場合に現れるバグを追跡しています。一方はすでにテレグラム マーキングを送信していますがlastSegment、もう一方は最後のセグメントを際限なく待っています。

私はこのコードを読みました:

#ifndef kBigEndian
    struct tTelegram
    {
       u8 lastSegment : 1;
       u8 reserved: 7;
       u8 data[1];
    };
#else
    struct tTelegram
    {
       u8 reserved: 7;
       u8 lastSegment : 1;
       u8 data[1];
    };
#endif

int や long などのマルチバイト型にエンディアンが関係していることは知っています。lastSegmentおよびreserved1 バイト内にあります。

それはバグですか?

4

2 に答える 2

2

構造体には 16 ビットあります。32 ビットまたは 64 ビットのアーキテクチャでは、生のバイナリを見ると、エンディアンに応じてdata「前」にreserved来る場合と「後」に来る場合があります。lastSegmentIE 32 ビットを考慮すると、構造体は 32 ビット境界に沿ってパックされる可能性があります。次のようになります。

 padbyte1 padbyte2 data lastSegment+reserved

またはそれはこのように見えるかもしれません

 lastSegment+reserved data padbyte1 padbyte2

したがって、これらの 16 ビットをネットワーク上に配置し、反対側で再解釈すると、dataまたはlastSegment

あなたの問題はバイト内ではなく、dataと の関係にreservedありlastSegmentます。

于 2012-12-03T04:14:05.233 に答える
1

ビットフィールドに関しては、同じ CPU で実行されている異なるコンパイラ間で順序は保証されません。理論的には、同じコンパイラでフラグを変更するだけで順序を変更することもできます(ただし、公平を期すために、実際にそれが起こるのを見たことがないことを付け加えなければなりません)。

于 2012-12-03T04:20:24.390 に答える