1

有人可以帮我理解以下文字:

双字节顺序

由十六进制表示(st uv wx yz)表示的数值应记录在一个八字节字段中,如(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];
}

然后我访问SecondFourBytesArray 以获得正确的值。

4

1 回答 1

4

字节顺序是指构成较大数据类型(例如 32 位整数)的各个字节在内存中存储的顺序。

传统上,一个 32 位整数在内存中以Little Endian 或 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];
   };
}
于 2013-10-09T17:46:17.757 回答