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并且reserved在一个字节内。

那是一个错误吗?

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

您的问题不在字节内,它datareservedand相关lastSegment

于 2012-12-03T04:14:05.233 回答
1

对于位域,即使在同一 CPU 上运行的不同编译器之间也不能保证排序。从理论上讲,您甚至可以通过使用相同的编译器更改标志来更改顺序(不过,公平地说,我必须补充一点,我实际上从未见过这种情况发生)。

于 2012-12-03T04:20:24.390 回答