有人可以帮助我理解以下文字:
双字节顺序
由十六进制表示(st uv wx yz)表示的数值应为 记录在8字节字段中(yz wx uv st st uv wx yz)。
注意: 例如,十进制数305419896具有(12 34 56 78)十六进制 表示并记录为(78 56 34 12 12 34 56 78)。
这对阅读价值意味着什么?我只是简单地将32位作为uint32
并且全部或者是否需要转换某些内容才能获得正确的值?或者我只从8字节字段中提取4个字节以获取值?
编辑: 这会在像这样的工会中发挥作用吗?
union test
{
uint64 fullValue;
uint8 FirstFourBytes[4];
uint8 SecondFourBytes[4];
}
然后我访问SecondFourBytes
数组以获得正确的值。
答案 0 :(得分:4)
字节顺序是指组成较大数据类型的单个字节(例如32位整数)存储在内存中的顺序。
传统上,32位整数在内存中以Little Endian or Big Endian字节顺序写出,占用4个字节(32位),但在您的情况下看起来协议规定整数存储在Little Endian和Big Endian一个接一个地排序,将存储所需的空间加倍到64位。
读取时,您必须考虑该值使用8个字节,并且您可以读取前4个字节(小端)或最后4个字节(大端),具体取决于哪个字节序(字节)您的平台使用。
编写时,您必须序列化两个版本,首先写出小端表示,然后是大端表示。
更新2
您修改后的联合仍然无效,因为您现在正在尝试在uint64
可能的64位数据类型和另外两个数组之间创建一个联合,每个数组占用4个字节(32位)。
// this is not right
union test
{
uint64 fullValue;
uint8 FirstFourBytes[4]; // this points to the first 4 bytes
uint8 SecondFourBytes[4]; // .. despite name, this also points to the first 4 bytes
}
但是,您可以使用这样的联合:
union test
{
uint64 fullValue; // although this is probably useless to you
struct Raw
{
uint8 LittleEndianBytes[4];
uint8 BigEndianBytes[4];
};
}