[C con Clase] como crear cadena de bytes?
Programante
programante en gmail.com
Vie Mar 9 13:53:33 CET 2007
J HU escribió:
> Hola gente!
>
> Al igual es una pregunta un tanto tonta, pero a ver si alguien puede echarme
> una mano.
>
> El caso es que quiero concatenar en un variable del tipo "unsigned char*"
> varios bytes.
>
¿Por qué unsigned ? Para enviarlo por el socket te da igual que sea
unsigned o signed, y te ahorras unos cuantos casts.
> Por ejemplo algo como esto:
>
> unsigned char* buf;
> int i=0,j=1;
> char* str="Cadena";
>
> asprintf((char*) buf,"%d%d%s",i,j,str);
>
Me parece que aquí debería ser asprintf((char**) &buf,"%d%d%s",i,j,str);
> Con esto lo aue quiero es crear una cadena de bytes que luego pueda enviar
> por un socket, pero mi problema esta en que no me crea la cadena de bytes
> corretamente ya que en el buffer me pone el valor ascii de los numeros que
> contiene i y j y no el valor en bytes, es decir, que en lugar de poner "00
> 00 00 01", me escribe "31", en lugar de 4 bytes, pone 1 byte.
>
Es lo que hace la familia printf con %d. Podrías usar %c, pero eso solo
te sirve para un byte.
> Entonces la otra manera que he visto de hacerlo es usando la funcion
> "memcpy", pero me resulta un poco mas "costoso" poraue tengo q insertar uno
> a uno. Ejemplo:
>
> buf = (unsigned char*) malloc(4+4+6);
> memcpy(buf,i,4);
> memcpy(buf+4,j,4);
> memcpy(buf+8,str,6);
>
> Assi si me escribe correctamente los bytes, pero resulta algo mas "complejo"
> de escribirlo.
>
Es la forma adecuada, copias la representación en memoria
> Entonces, alguien podria decirme si hay alguna manera de hacerlo mas simple?
>
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);
Más información sobre la lista de distribución Cconclase