[C con Clase] como crear cadena de bytes?

J HU judowold en hotmail.com
Vie Mar 9 14:38:05 CET 2007


>J HU escribió:
> >> Podrías usar un struct para simplificar el sistema:
> >> struct EnterosYCadena {
> >>  int i;
> >>  int j;
> >>  char str[1];
> >> }* buf;
> >> int tamano = sizeof(struct EnterosYCadena) + strlen(str);
> >> buf = malloc(tamano);
> >>
> >> buf->i = i;
> >> buf->j = j;
> >> strcpy(buf->str, str);
> >>
> >> send(socket, buf, tamano);
> >>
> >
> > Si es correcto, asi es como la tenia, tenia creada una estructura de 
>tama~no
> > fijo y no habia problema, pero debo cambiarle a una dinamica y necesito
> > "serializarla", pasarla a un array de bytes antes de enviarla...
> >
> > struct EnterosYCadena {
> >   int i;
> >   int j;
> >   char *str;
> >   int longStr;
> > }* buf;
> >
> > Entonces es con algo como esta estructura con la que tengo problemas...
> >
>Cambiala a
>
>struct EnterosYCadena {
>   int i;
>   int j;
>   int longStr;
>   char str[0];
>}* buf;
>
>De esta forma la cadena queda al final del todo, usando memoria contigua
>a los enteros. Luego puedes enviar con
>
>send(socket, buf, sizeof(struct EnterosYCadena) + buf->longStr, 0);
>
>El detalle es que debes reservar la memoria junto con el struct,
>restando/sumando sizeof(struct EnterosYCadena) en las peticiones de 
>memoria.
>En este segundo ejemplo he usado un array de 0 caracteres al final. Esto
>es una extensión GNU, en algunos compiladores puedes tener que hacerlo
>de un byte y tenerlo en cuenta en el cálculo de cantidades. También
>tienes que tener claro cuando envías por el socket si quieres enviar un
>caracter nulo al final de la cadena o no (normalmente no), pues variaría
>respecto al almacenamiento (cantidad de bytes a reservar, etc).
>

Gracias de nuevo.

Esta opcion de poner el buffer al final la habia pensado, pero eso de 
reservar la memoria, que se haga de manera contigua, no se si se hace 
directamente, ya por defecto la coge contigua al struct o debo hacer lago en 
especial....

Y despues aunque no quisiera parecer pesado, en el caso se no poder hacer el 
envio de la estructura, por lo que sea, que tenga 3 char* diferentes o otros 
tipos de estructuras :

struct EnterosYCadena {
   int i;
   int j;
   char *str1;
   int longStr1;
   char *str2;
   int longStr2;
   char *str3;
   int longStr3;
   otraEstructura *otra;
}* buf;

Habria alguna manera de convertirlo a bytes o todo se haria a base de 
"memcpy"?

Gracias una vez mas

_________________________________________________________________
Dale rienda suelta a tu tiempo libre. Mil ideas para exprimir tu ocio con 
MSN Entretenimiento. http://entretenimiento.msn.es/





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