字节内的字节序

时间:2012-12-03 04:10:19

标签: c++ endianness

最近,我正在追踪网络通信双方具有不同字节顺序时出现的错误。一方已发送电报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等。但为什么它关注前面的代码? lastSegmentreserved位于单个字节内。

这是一个错误吗?

2 个答案:

答案 0 :(得分:2)

你的struct中有16位。在32位或64位架构上,取决于字节顺序data可能会在“reservedlastSegment之前”出现, “当看原始二进制文件时。 IE如果我们考虑32位,您的结构可能会沿着32位边界打包。它可能看起来像这样:

 padbyte1 padbyte2 data lastSegment+reserved

或者看起来像这样

 lastSegment+reserved data padbyte1 padbyte2

因此,当您将这16位放在线路上然后在另一侧重新解释它们时,您知道您是否正在获得datalastSegment

您的问题不在字节内,data位于reservedlastSegment的位置。

答案 1 :(得分:1)

对于位域,在同一CPU上运行的不同编译器之间不能保证甚至的排序。理论上理论甚至可以通过使用相同的编译器更改标志来改变顺序(但是,公平地说,我必须补充一点,我从未真正看到过这种情况)。