【问题标题】:Understand Both Byte Order了解两个字节顺序
【发布时间】:2013-10-09 17:41:20
【问题描述】:

谁能帮我理解以下文字:

双字节顺序

由十六进制表示(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];
}

然后我访问 SecondFourBytes 数组以获取正确的值。

【问题讨论】:

  • 使用联合,数组重叠。它们不会叠加,因此 FirstFourBytes 和 SecondFourBytes 将包含完全相同的数据。

标签: c endianness


【解决方案1】:

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

传统上,32 位整数在内存中以Little Endian or Big Endian 字节顺序写入,占用 4 个字节(32 位),但在您的情况下,协议似乎规定整数同时存储在 Little Endian 和Big Endian 一个接一个地排序,将存储所需的空间增加一倍,达到 64 位。

读取时,必须考虑到该值使用 8 个字节,可以读取前 4 个字节(小端)或后 4 个字节(大端),具体取决于哪种字节序(字节订单)您的平台使用。

编写时,您必须序列化两个版本,首先写出小端表示,然后是大端表示。

更新 2

您修改后的联合仍然无法工作,因为您现在正尝试在可能是 64 位数据类型的 uint64 和其他两个数组之间创建联合,每个数组占用 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];
   };
}

【讨论】:

  • 首先:非常感谢您的帮助。我仍然不确定我是否理解您的代码和我的代码之间的区别。结构有什么不同?
  • @JeckyPorter - 不客气。该结构按顺序存储两个数组,一个接一个。联合更像是一个别名,用于相同的内存位置。
  • @JeckyPorter 不同之处在于联合仅与最大成员一样大......所以在你的联合中,你有 3 个值从同一个地址开始,而在 miky 中你有 3 个值,完整value 和 littleEndianBytes 从同一个地址开始,BigEndian 晚 4 个字节开始。
  • 你真的不需要工会。在这种情况下,您只需要一个结构。您只需要编写代码来手动将一个 32 位整数映射到结构体和从结构体映射出一个 32 位整数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2020-11-02
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多