tipos tipo sirve rangos que para long lenguaje datos dato c sockets endianness

tipo - unsigned char c



Orden de bytes con una gran variedad de caracteres en C (6)

Esto funciona bien cuando estoy tratando los datos como un resumen, sin embargo, si echo el puntero a un carácter nuevo, los bytes se invierten.

Eso es lo que esperaría.

¿Qué estoy haciendo mal?

Debe saber lo que envió el remitente: saber si los datos son bytes (que no necesitan inversión) o cortos o largos (que sí lo son).

Google para obtener tutoriales asociados con las ntohs , htons y htons .

Hola chicos, pregunta de un novato de C / Networking ...

Estoy haciendo algo de programación de socket en C y tratando de luchar con los problemas de orden de bytes. Mi solicitud (enviar) está bien, pero cuando recibo datos, mis bytes están fuera de servicio. Comienzo con algo como esto ...

char * aResponse= (char *)malloc(512); int total = recv(sock, aResponse, 511, 0);

Al tratar con esta respuesta, cada palabra de 16 bits parece tener sus bytes invertidos (estoy usando UDP). Traté de arreglar eso haciendo algo como esto ...

unsigned short * _netOrder= (unsigned short *)aResponse; unsigned short * newhostOrder= (unsigned short *)malloc(total); for (i = 0; i < total; ++i) { newhostOrder[i] = ntohs(_netOrder[i]); }

Esto funciona bien cuando estoy tratando los datos como un resumen, sin embargo, si echo el puntero a un carácter nuevo, los bytes se invierten. ¿Qué estoy haciendo mal?

¡Gracias!


Aparte de su pregunta original (que creo que ya fue respondida), debería echarle un vistazo a su declaración malloc . malloc asigna bytes y un corto sin signo tiene más probabilidades de ser de dos bytes.

Su declaración debe verse así:

unsigned short *ptr = (unsigned short*) malloc(total * sizeof(unsigned short));


No está claro qué representa una aResponse (cadena de caracteres? Struct?). La endianidad es relevante solo para los valores numéricos, no para los caracteres. También debe asegurarse de que, por parte del remitente, todos los valores numéricos se conviertan del orden de bytes de la hton* a la red ( hton* ).


el orden de bytes de la red es big endian, por lo que debes convertirlo en little endian si quieres que tenga sentido, pero si solo se trata de una matriz, no debería causar problemas, ¿cómo envía el remitente sus datos?


Ok, parece que hay problemas con lo que estás haciendo en dos niveles diferentes. Parte de la confusión aquí parece derivar para su uso de punteros, a qué tipo de objetos apuntan, y luego la interpretación de la codificación de los valores en la memoria apuntada por el (los) puntero (s).

La codificación de entidades de múltiples bytes en la memoria es lo que se conoce como endianess. Las dos codificaciones comunes se conocen como Little Endian (LE) y Big Endian (BE). Con LE, una cantidad de 16 bits como un corto se codifica primero como el byte menos significativo (LSB). En BE, el byte más significativo (MSB) se codifica primero.

Por convención, los protocolos de red normalmente codifican cosas en lo que llamamos "orden de bytes de red" (NBO) que también es igual a BE. Si está enviando y recibiendo almacenamientos intermedios de memoria en plataformas de Big Endian, entonces no se encontrará con problemas de conversión. Sin embargo, su código dependería de la plataforma según la convención de BE. Si desea escribir código portátil que funcione correctamente en las plataformas LE y BE, no debe asumir la endialeza de la plataforma.

Lograr la portabilidad endian es el propósito de rutinas como ntohs () , ntohl () , htons () y htonl () . Estas funciones / macros se definen en una plataforma determinada para realizar las conversiones necesarias en los extremos de envío y recepción:

  • htons () - Convierte un valor corto de una orden de host a una orden de red (para enviar)
  • htonl () - Convierte un valor largo de una orden de host a una orden de red (para enviar)
  • ntohs () - Convierta un valor corto desde el orden de la red al orden del host (después de recibirlo)
  • ntohl () - Convierte un valor largo de una orden de red a una orden de host (después de recibir)

Comprenda que su comentario sobre el acceso a la memoria cuando se regresa a los caracteres no afecta el orden real de las entidades en la memoria. Es decir, si accede al búfer como una serie de bytes, verá los bytes en el orden en que se codificaron en la memoria, ya sea que tenga una máquina BE o LE. Entonces, si está mirando un búfer codificado NBO después de recibirlo, el MSB será el primero, siempre. Si observa el búfer de salida después de haber convertido de nuevo a la orden de host, si tiene la máquina BE, la orden de bytes no cambiará. Por el contrario, en una máquina LE, todos los bytes se revertirán en el búfer convertido.

Finalmente, en su ciclo de conversión, el total variable se refiere a bytes. Sin embargo, estás accediendo al buffer como shorts . Su protector de lazo no debe ser total , pero debe ser:

total / sizeof( unsigned short )

para dar cuenta de la naturaleza de doble byte de cada short .


Para un solo byte, puede que no nos importe el orden de bytes.