最近,我正在追踪网络通信双方具有不同字节顺序时出现的错误。一方已发送电报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
位于单个字节内。
这是一个错误吗?
答案 0 :(得分:2)
你的struct中有16位。在32位或64位架构上,取决于字节顺序,data
可能会在“reserved
和lastSegment
之前”出现, “当看原始二进制文件时。 IE如果我们考虑32位,您的结构可能会沿着32位边界打包。它可能看起来像这样:
padbyte1 padbyte2 data lastSegment+reserved
或者看起来像这样
lastSegment+reserved data padbyte1 padbyte2
因此,当您将这16位放在线路上然后在另一侧重新解释它们时,您知道您是否正在获得data
或lastSegment
?
您的问题不在字节内,data
位于reserved
和lastSegment
的位置。
答案 1 :(得分:1)
对于位域,在同一CPU上运行的不同编译器之间不能保证甚至的排序。理论上理论甚至可以通过使用相同的编译器更改标志来改变顺序(但是,公平地说,我必须补充一点,我从未真正看到过这种情况)。