首页 > 解决方案 > 将 115 位数据转换为位域联合会得到错误的结果

问题描述

我正在尝试将 115 位数据转换为位域的联合并得到错误的结果。

设置

我有两种类型的数据:

Configuration: data[62:0]
               addr[113:107]
               type[114]

RawBits:       lowBits[63:0]
               highBits[115:64]

所以我定义了以下位域和联合:

typedef struct RawBits {
  unsigned long int lowBits:64;
  unsigned long int highBits:51;
  unsigned long int reserved :13;
} __attribute__((packed))rawBits;

typedef struct Configuration {
  unsigned long int data : 62;
  unsigned long int addr : 7;
  unsigned long int type : 1;
  unsigned long int reserved : 58;
} __attribute__((packed))Configuration ;

typedef union Instruction {
  RawBits bits;
  Configuration configuration;
} __attribute__((packed))Instruction;

作为我使用的数据:

uint8_t configuration_test[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00,

为了将缓冲区转换为联合类型,我使用了简单的强制转换:

Instruction *instruction = (Instruction *)configuration_test;

预期结果

instruction->bits->lowBits  = 0xfffffffffffffffc
instruction->bits->highBits = 0x00000000000001fc
instruction->bits->reserved = 0x0000000000000000

instruction->configuration->data     = 0x3fffffffffffffff
instruction->configuration->addr     = 0x000000000000007f
instruction->configuration->type     = 0x0000000000000000
instruction->configuration->reserved = 0x0000000000000000

实际结果

instruction->bits->lowBits  = 0xfcffffffffffffff
instruction->bits->highBits = 0x0004010000000000
instruction->bits->reserved = 0x000000000000001f

instruction->configuration->data     = 0x3cffffffffffffff
instruction->configuration->addr     = 0x0000000000000003
instruction->configuration->type     = 0x0000000000000000
instruction->configuration->reserved = 0x0003f00400000000

标签: c++endiannessunionsbit-fields

解决方案


推荐阅读