2012-08-10 38 views
8

Có cách nào để đúc cấu trúc thành uint64_t hoặc bất kỳ int nào khác không, cho cấu trúc đó trong < = với sizeof int không? Điều duy nhất tôi có thể nghĩ đến chỉ là một giải pháp 'ok' - để sử dụng công đoàn. Tuy nhiên tôi chưa bao giờ thích chúng.Cấu trúc đúc vào int

Hãy để tôi thêm một đoạn mã để làm rõ:

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; 

Bây giờ làm thế nào để tôi đúc some_struct để nắm bắt các bit của nó đặt trong uint32_t đăng ký.

Hy vọng điều đó sẽ rõ ràng hơn một chút.

+4

Có luôn memcpy! –

+0

@MartinBeckett Điều này sẽ làm cho một câu trả lời tốt đẹp :) – dasblinkenlight

+7

Không "thích" của các công đoàn? Một công đoàn thực hiện chính xác những gì bạn muốn làm một cách rõ ràng, có thể bảo trì. "OK" là gì? –

Trả lời

1

Một giải pháp không cầm tay:

struct smallst { 
    int a; 
    char b; 
}; 

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

Bạn có thể phải đối mặt với vấn đề nếu bạn, ví dụ, gói struct trên một máy ít về cuối nhỏ và giải nén nó vào một máy lớn về cuối nhỏ.

15

Tôi đã chỉ cần nhấn cùng một vấn đề, và tôi giải quyết nó với một liên minh như thế này:

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, Alex

0

bạn có thể sử dụng con trỏ và nó sẽ được dễ dàng ví dụ :

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; 

hy vọng nó sẽ giúp

+0

Điều đó sẽ yêu cầu một kiểu chữ trong bất kỳ trình biên dịch phù hợp nào và cũng sẽ trên nhiều trình biên dịch yêu cầu sử dụng '-fno-strict-aliasing' hoặc một số tùy chọn tương tự. – supercat

Các vấn đề liên quan