c - 从结构位域以十六进制打印完整的 uint32_t
问题描述
我有一个如下结构:
struct myCoolStuff{
uint32_t stuff1 : 4;
uint32_t stuff2 : 4;
uint32_t stuff3 : 24;
uint32_t differentField;
}
如何将这些字段组合成十六进制格式以打印到屏幕或写入文件?谢谢你。
struct myCoolStuff data = {.stuff1=0xFF, .stuff2=0x66, .stuff3=0x112233, .differentField=99};
printf("my combined stuff is: %x\n", <combined stuff>);
printf("My full field is: %x\n", data.differentField);
Expected Output:
my combined stuff is: 0xFF66112233
My different field is: 99
解决方案
首先,你把它放在一个 4 位变量中后就无法0xFF
脱身。占用 8 位。对于.0xFF
0xFF
0x66
至于将位域重新解释为单个整数,您可以以非常不可移植的方式(存在大端/小端问题以及填充位的可能性)使用union
.
( 这个:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
struct myCoolStuff{
union{
struct {
uint32_t stuff1 : 4;
uint32_t stuff2 : 4;
uint32_t stuff3 : 24;
};
uint32_t fullField;
};
};
struct myCoolStuff data = {.stuff1=0xFF, .stuff2=0x66, .stuff3=0x112233};
int main()
{
printf("My full field is: %" PRIX32 "\n", data.fullField);
}
1122336F
在我的 x86_64 上打印。)
要做到这一点,您可以简单地获取位域并手动将它们组合在一起:
这个:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
struct myCoolStuff{
uint32_t stuff1 : 4;
uint32_t stuff2 : 4;
uint32_t stuff3 : 24;
};
struct myCoolStuff data = {.stuff1=0xFF, .stuff2=0x66, .stuff3=0x112233};
int main()
{
uint32_t fullfield = data.stuff1 << 28 | data.stuff2 << 24 | data.stuff3;
printf("My full field is: %" PRIX32 "\n", fullfield);
}
F6112233
应该在它编译的任何地方打印(uint32_t
不保证存在(尽管在 POSIX 平台上它会存在);uint_least32_t
会更便携。)
小心确保data.stuff1
有足够的位可以移动28
. 你这样做是因为它是 typed uint32_t
,但这样做会更安全,例如,对于第二班,使用(data.stuff1 + 0UL)<<28
or和相同。(data.stuff1 + UINT32_C(0))<<28
推荐阅读
- javascript - 在生产代码中记录缩小的 JavaScript 错误
- php - 它是什么代码以及如何在php中重写
- javascript - 在momentjs中将日期从给定格式转换为yyyy-mm-dd
- cqrs - 如果事件存储中存在某些事件,则首次应用启动失败
- excel - excel边框外底部的一行,如何解决?
- regex - Bash / 正则表达式转换
- html - HTML/CSS - 两个具有单一渐变背景但有一个粘性元素的 div
- formal-verification - 为什么我不能从 Dafny 的幽灵场中调用(非静态)引理?
- mysql - Laravel db query with now()
- routing - Angular 6重新加载参数更改页面