字节内的恩迪亚
Endianess inside a byte
本文关键字:字节 更新时间:2023-10-16
最近我正在追踪一个错误,当网络通信的两端具有不同的字节序时会出现该错误。一方已经发了一封电报,标记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
位于单个字节内。
这是一个错误吗?
你的结构中有 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
相关的位置。
当涉及到位字段时,即使在在同一 CPU 上运行的不同编译器之间也不能保证排序。理论上,您甚至可以通过使用相同的编译器更改标志来更改顺序(尽管,公平地说,我必须补充一点,我从未真正看到过这种情况发生)。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当比特(而不是字节)的顺序至关重要时的持久性
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 如何在文件中查找字节序列
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字节到位运算符重载C++
- 在java中读取c++字节的位字段
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 字节真的是最小可寻址单元吗
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 如何将原始字节附加到 std::vector?
- 基于字节数组生成静态范围整数值