[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