2010-04-22 15 views
6

¿Cómo convertirías cualquier estructura en matriz de bytes en procesadores con little-endian?Convertir estructura en bytes

+2

ampliar su solicitud por favor - y tenga en cuenta que su respuesta será muy dependiente de la arquitectura del procesador – KevinDTimm

+0

Cuál es la unidad de direccionamiento para endian pequeño? ¿Qué estás realmente tratando de hacer? – WhirlWind

Respuesta

11

Puede utilizar un char* para acceder a cualquier tipo de objeto en C++, por lo que:

struct S 
{ 
    int a; 
    int b; 
    // etc. 
}; 

S my_s; 

char* my_s_bytes = reinterpret_cast<char*>(&my_s); 

// or, if you prefer static_cast: 
char* my_s_bytes = static_cast<char*>(static_cast<void*>(&my_s)); 

(Hay al menos some debate sobre la exactitud de la reinterpret_cast frente a la static_cast; en la práctica, realmente no importa - ambos deben dar el mismo resultado)

+0

:-) demasiadas mejoras de lenguaje ahora en C++. Mientras que antes, esto sería suficiente: 'char * b = (char *) &my_s;' Tal vez si aprendo C++ de nuevo, primero leeré algo sobre esas construcciones fundidas. –

+3

@Michael: Ese modelo C es el mismo que el 'reinterpret_cast' en este caso, porque ninguna combinación de' static_cast' y 'const_cast' es válida. Usar los moldes de estilo C++ te garantiza obtener el reparto que deseas; el elenco estilo C básicamente solo intenta una secuencia de cinco tipos diferentes de moldes hasta que encuentra uno que funciona. –

+0

La respuesta es correcta dada la estructura que especificó. Sin embargo, arroja algunos shorts, large_integers o datos de personajes allí y es terriblemente incorrecto. –

5
I like to use a union. 

typedef struct b { 
    unsigned int x; 
    unsigned int y; 
} b_s; 

typedef union a { 
    b_s my_struct; 
    char ary[sizeof(b_s)]; 
} a_u; 
+1

¿Por qué no simplemente 'ary [sizeof (b)]'? –

+0

@Rob Lo suficientemente justo ... cambiado. – WhirlWind

2
(char*)&someStruct 
+1

Bueno ... 'char', no' byte'. – Blindy

+0

#define byte (char sin signo) –

2

¿Qué estás tratando de hacer? Si está tratando de serializar la estructura para que pueda guardarla en un archivo o pasarla en un mensaje, es mejor que use una herramienta diseñada para eso como boost::serialization.

Si lo que desea es una matriz de bytes que podría reinterpret_cast<char*> como han mencionado otros, o hacer:

MyStruct s; 
char [] buffer = new char[sizeof(s)]; 
memcpy(&buffer, &s, sizeof(s)); 
1

he contemplado en el void*.

struct gizmo 
{ 
//w/e 
}; 

//stuff 

gizmo *G = new gizmo; 

void* bytearray = (void*)G; 

Cómo su estructura se llena es ambiguo y depende de compilador, ABI, y la CPU. Tendrá que averiguarlo en sus manuales & y leer algunos ensamblajes.

+1

No puede acceder a los bytes a través de un vacío * – nos

+0

@nos: expanda, por favor. –

+0

Como no puede desreferenciar un vacío *, no puede acceder a lo que apunte (tal vez bar utilizando memcpy, en cuyo caso un vacío intermedio * no es necesario) foo [0]; es un error del compilador si foo es un vacío *. Use un char * sin signo para acceder a bytes individuales. – nos

0

El problema con todas estas respuestas es que realmente no se puede hacer intercambio de bytes tonto sin saber algo acerca de los datos que está intercambiando. Los datos de caracteres no se se intercambian. Los enteros de 64 bits necesitan un tipo diferente de intercambio dependiendo de cómo exactamente los implementaron los dos procesadores en cuestión.

Cuestiones relacionadas