[C con Clase] Serializar variables

Steven Davidson srd4121 en njit.edu
Vie Mar 12 21:17:38 CET 2010


Hola Ferrán,

Ferran Ferri wrote:
> Hola,
> 
> tengo una duda. Estoy haciendo un programa que mete clases en 
> archivos. Necesito una funcion que para algunos atributos (bastante 
> manual, algunas propiedades que yo elija y ya esta), se copien en
> modo binario en un array de unsigned char.
> 
> Lo hago asi:
> #include <iostream>
> #include <algorithm>
> using namespace std;
> void toArray(unsigned char* data)
> {
>     int a = 3;
>     long b = 444;
>     int *pA = &a;
>     long *pB = &b;
> 
>     cout << "Valor de *pA " <<*pA <<endl;
>     memcpy(data,(unsigned char*)pA,sizeof(int));
>     data+=sizeof(int);
>     cout << "Valor de *pB " <<*pB <<endl;
>     memcpy(data,(unsigned char*)pB,sizeof(long));
>     data+=sizeof(long);

No es necesario usar estas funciones. Podemos "engañar" a C++ para que 
trate ciertas variables de un tipo como si fueran de otro. En este caso, 
usaremos el operador 'reinterpret_cast'. Por ejemplo,

*reinterpret_cast< int * >( data ) = a;
*reinterpret_cast< long * >( data+sizeof(int) ) = b;

> }
> int main(){
>     int theArraySize = sizeof(int)+sizeof(long);
>     unsigned char* theData = new unsigned char[theArraySize];
>     fill_n(theData,theArraySize,0);
>     toArray(theData);
> 
>     cout << "Hello World!" << endl;
>     delete[] theData;
>     return EXIT_SUCCESS;
> }
> 
> Pero segun el debug los resltados no son correctos. Me podeis explicar
> como hacerlo, please?

Creo que no has tomado en cuenta la ordenación de los bytes en un 
procesador. Si usas un procesador de Intel, entonces los primeros bytes 
se refieren a la información menos importante de un valor; es decir, los 
primeros bytes contienen los últimos octetos del valor en binario. Por 
ejemplo, el número entero 65000 de tipo 'unsigned short' de 16 bits se 
representa en binario así:

11111101 11101000

(0xFDE8 en hexadecimal)

En un procesador de Intel y cualquiera de tipo "Little Endian", 
almacenará la información anterior de esta manera:

11101000 11111101

(0xE8FD en hexadecimal)

mientras que un procesador de tipo "Big Endian", almacenará los bytes de 
mayor a menor "importancia"; o sea,

11111101 11101000

(0xFDE8 en hexadecimal)

Por lo tanto, sospecho que tu programa sí muestra la información 
correctamente, pero quizá no estabas interpretándola como deberías.

Si por el contrario, éste no es el problema, entonces creo que deberías 
darnos más detalles, como por ejemplo qué te dice el depurador y por qué 
está mal.


Espero haber aclarado la duda.

Steven





Más información sobre la lista de distribución Cconclase