理解两个字节顺序

时间:2013-10-09 17:41:21

标签: c endianness

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

  

双字节顺序

     

由十六进制表示(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数组以获得正确的值。

1 个答案:

答案 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];
   };
}