c++ - 将 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
解决方案
推荐阅读
- docker - 在 Docker 中为 .NET Core 设置 CI/CD?
- r - 多个样本的 R 回归
- android - 使用retrofit2在json对象中发布json数组时遇到问题
- javascript - 尝试在 react emoji 上做 discord.js 得到 dm
- python - Tor 浏览器没有启动,虽然我有 totor.exe 的路径
- twitter-bootstrap-3 - 如何从引导程序将活动类设置为导航菜单
- bash - 将不同编码的电影移动到具有原始电影标题的公共文件夹
- azure - 尝试创建 Azure SQL 逻辑服务器时出现 UpsertLogicalServerRequestAlreadyInProgress
- python - 如何在树莓派 3 上安装 librosa?
- python-3.x - 逐行堆叠numpy数组