2012-08-10 10 views
8

¿Hay una forma limpia de convertir una estructura en uint64_t o cualquier otra int, dado que struct en < = al tamaño de int? Lo único que se me ocurre es solo una solución "aceptable": usar uniones. Sin embargo, nunca les he tenido cariño.Casting struct into int

permítanme añadir un fragmento de código para aclarar:

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; 

Ahora ¿Cómo me echo some_struct para capturar sus bits de orden en el registro uint32_t.

Espero que lo haga un poco más claro.

+4

siempre ha establecimiento de memoria! –

+0

@MartinBeckett Esto sería una buena respuesta :) – dasblinkenlight

+7

¿No es "aficionado" a los sindicatos? Una unión hace exactamente lo que quiere hacer de una manera clara y sostenible. ¿Qué está "bien" sobre eso? –

Respuesta

1

Una solución no portátil:

struct smallst { 
    int a; 
    char b; 
}; 

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

Usted puede enfrentar problemas si, por ejemplo, el paquete de la estructura en una máquina ascendente hacia la izquierda y descomprimirlo en una máquina-big endian.

15

he acaba de golpear el mismo problema, y ​​lo resolvió con una unión como esta:

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

puede utilizar punteros y será más fácil, por ejemplo, :

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; 

creo que sirve

+0

Eso requerirá un encasillado en cualquier compilador conforme, y también en muchos compiladores requerirá el uso de '-fno-strict-aliasing' u otra opción similar. – supercat