首页 > 解决方案 > 从结构位域以十六进制打印完整的 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

标签: ciobit-fields

解决方案


首先,你把它放在一个 4 位变量中后就无法0xFF脱身。占用 8 位。对于.0xFF0xFF0x66

至于将位域重新解释为单个整数,您可以以非常不可移植的方式(存在大端/小端问题以及填充位的可能性)使用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)<<28or和相同。(data.stuff1 + UINT32_C(0))<<28


推荐阅读