¿Qué transformaciones utilizan los sistemas little-endian para convertir datos en orden de red?

StackOverflow https://stackoverflow.com/questions/463416

Pregunta

¿Cuáles son las transformaciones subyacentes que son necesarias para convertir datos en un sistema little-endian en orden de bytes de red? Para datos de 2 bytes y 4 bytes hay funciones bien conocidas (como htons, ntohl, etc.) para encapsular los cambios, ¿qué sucede con las cadenas de datos de 1 byte (si corresponde)?

Además, Wikipedia implica que little-endian es la imagen especular de big-endian, pero si eso fuera cierto, ¿por qué necesitaríamos un manejo específico para datos de 2 y 4 bytes?

El ensayo "Sobre guerras santas y una súplica por la paz" parece implicar que hay muchos sabores diferentes de little-endian, es un viejo ensayo, ¿eso todavía se aplica? ¿Siguen siendo necesarios los marcadores de orden de bytes como los que se encuentran al principio de los archivos de clase Java?

Y finalmente, ¿es necesaria la alineación de 4 bytes para el orden de los bytes de red?

¿Fue útil?

Solución

Digamos que tiene el texto ASCII " BigE " en una matriz b de bytes.

b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'

Este es el orden de red para la cadena también.

Si se tratara como un entero de 32 bits, sería

'B' + ('i' << 8) + ('g' << 16) + ('E' << 24) 

en una pequeña plataforma endian y

'E' + ('g' << 8) + ('i' << 16) + ('B' << 24) 

en una gran plataforma endian.

Si convierte cada trabajo de 16 bits por separado, no obtendrá ninguno de estos

'i' + ('B' << 8) + ('E' << 16) + ('g' << 24) 

razón por la cual ntohl y ntohs son necesarios.

En otras palabras, ntohs intercambia bytes dentro de un corto de 16 bits, y ntohl invierte el orden de los cuatro bytes de su palabra de 32 bits.

Otros consejos

Las funciones de manejo específicas para datos de 2 y 4 bytes aprovechan el hecho de que hay instrucciones de procesador que operan en tamaños de datos específicos. Ejecutar una función de inversión de 1 byte cuatro veces es ciertamente menos eficiente que usar instrucciones más amplias para realizar las mismas operaciones (aunque aumentadas en escala) en los cuatro bytes a la vez.

Los datos de 1 byte no requieren ninguna conversión entre endianos (es una ventaja de UTF-8 sobre UTF-16 y UTF-32 para la codificación de cadenas).

  

¿es necesaria la alineación de 4 bytes para el orden de los bytes de red?

No es necesaria una alineación específica para los bytes que pasan por una red. Su procesador puede exigir una cierta alineación en la memoria, pero depende de usted resolver la discrepancia. La familia x86 generalmente no hace tales demandas.

La idea básica es que todos los tipos de bytes múltiples deben tener el orden de sus bytes invertidos. Un entero de cuatro bytes tendría los bytes 0 y 3 intercambiados, y los bytes 1 y 2 intercambiados. Un entero de dos bytes tendría los bytes 0 y 1 intercambiados. Un carácter de un byte no se intercambia.

Hay dos implicaciones muy importantes de esto que los no practicantes y los novatos no siempre se dan cuenta:

  1. (ASCII) Las cadenas de caracteres no se tocan.
  2. Hay no un posible algoritmo oculto para intercambiar bytes "datos genéricos". Debe conocer el tipo de todos sus datos e intercambiar cada elemento de la manera requerida para su tipo.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top