2012-08-10 18 views
8

構造体をuint64_tまたは他のint型にキャストするきれいな方法がありますか?< = sizeof int? 私が考えることができる唯一のことは、「OK」ソリューション、すなわちユニオンを使用することです。しかし、私は一度も好きではありません。structを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をキャストしますか。

希望は少し明確になります。

+4

memcpyのは常にありますが役に立てば幸い! –

+0

@MartinBeckettこれは素敵な答えを作るだろう:) – dasblinkenlight

+7

組合の「好き」ではない?組合は、明確で維持可能な方法で、あなたがしたいことを正確に行います。それについてちょうど「OK」は何ですか? –

答えて

1

非ポータブルソリューション:あなたは、例えば、リトルエンディアンのマシン上の構造体をパックし、ビッグエンディアンのマシン上でそれを解凍した場合

struct smallst { 
    int a; 
    char b; 
}; 

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

あなたが問題に直面する可能性があります。

15

私はちょうど同じ問題をヒットしてきた、と私はこのような労働組合とそれを解決する:あなたは、ポインタを使用することができ、それは例えば 簡単になります

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、 アレックス

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; 

は、それが

+0

これは、適合するコンパイラでタイプキャストが必要になります。また、多くのコンパイラでは '-fno-strict-aliasing'などのオプションを使用する必要があります。 – supercat

関連する問題