[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