是否有一种将结构转换为uint64_t或任何其他int的简洁方法,假设该结构在< = sizeof 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;
现在我如何在uint32_t寄存器中转换some_struct以捕获它的位顺序。
希望能让它更清晰一点。
答案 0 :(得分:16)
我刚刚遇到同样的问题,我用这样的联盟解决了这个问题:
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, 亚历
答案 1 :(得分:1)
非便携式解决方案:
struct smallst {
int a;
char b;
};
void make_uint64_t(struct smallst *ps, uint64_t *pi) {
memcpy(pi, ps, sizeof(struct smallst));
}
如果您将结构打包在little-endian机器上并在大端机器上解压缩,则可能会遇到问题。
答案 2 :(得分:0)
你可以使用指针,这很容易 例如:
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;
希望有所帮助