[C con Clase] como crear cadena de bytes?

Programante programante en gmail.com
Vie Mar 9 14:25:22 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).




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