gpt4 book ai didi

c - 从 struct bitfield 以十六进制打印完整的 uint32_t

转载 作者:行者123 更新时间:2023-12-02 09:10:07 28 4
gpt4 key购买 nike

我的结构如下:

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

最佳答案

首先,你得不到0xFF来自 0xFF将其放入 4 位变量后。 0xFF占用 8 位。同样适用于 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 .你的是因为它输入了 uint32_t , 但这样做会更安全,例如使用 (data.stuff1 + 0UL)<<28(data.stuff1 + UINT32_C(0))<<28第二类也一样。

关于c - 从 struct bitfield 以十六进制打印完整的 uint32_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53396492/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com