11

考虑到 <= 中的结构为 int 的 sizeof,是否有一种将结构转换为 uint64_t 或任何其他 int 的干净方法?我唯一能想到的只是一个“好的”解决方案——使用工会。然而我从来没有喜欢过他们。

让我添加一个代码片段来澄清:

typedef struct {
uint8_t field: 5;
uint8_t field2: 4;
/* and so on... */
}some_struct_t;

some_struct_t some_struct;
//init struct here

uint32_t register;

现在我如何转换 some_struct 以在 uint32_t 寄存器中捕获其位顺序。

希望这能让它更清楚一点。

4

3 回答 3

26

我刚刚遇到了同样的问题,我用这样的工会解决了这个问题:

typedef union {
    struct {
        uint8_t field: 5;
        uint8_t field2: 4;
        /* and so on... */
    } fields;
    uint32_t bits;
} some_struct_t;

/* cast from uint32_t x */
some_struct_t mystruct = { .bits = x };

/* cast to uint32_t */
uint32_t x = mystruct.bits;

HTH,亚历克斯

于 2013-05-07T14:27:19.960 回答
2

非便携式解决方案:

struct smallst {
  int a;
  char b;
};

void make_uint64_t(struct smallst *ps, uint64_t *pi) {
  memcpy(pi, ps, sizeof(struct smallst));
}

例如,如果您在小端机器上打包结构并在大端机器上解包,您可能会遇到问题。

于 2012-08-10T14:41:11.193 回答
1

您可以使用指针,这很容易,例如:

struct s {
    int a:8;
    int b:4;
    int c:4;
    int d:8;
    int e:8; }* st;

st->b = 0x8;
st->c = 1;
int *struct_as_int = st;

希望能帮助到你

于 2016-10-25T07:00:40.853 回答