representacion network little endian ejemplos conversion big and c endianness

c - network - ¿Puede el endianness referirse a los bits ordenados en un byte?



network byte order (5)

Estoy leyendo "Learning Core Audio: una guía práctica para la programación de audio para Mac y iOS" por Chris Adamson, y en un momento el autor describe big-endian como:

los bits altos de un byte o palabra son numéricamente más significativos que los inferiores.

Sin embargo, hasta ahora pensé que el problema de endian big-little solo se aplica al orden de bytes y no al orden de bits. Un byte tiene el mismo orden de bits (de izquierda a derecha), no importa si estamos hablando de sistemas little endian o big endian. ¿Me equivoco? ¿Está el autor equivocado? ¿O entendí mal su punto?


Como normalmente no puede direccionar los bits dentro de un byte individualmente, generalmente no existe un concepto de "bit endianness".


El único sentido en el que existe tal cosa como "orden de bits" es el orden en que los bits se asignan a los campos de bits. Por ejemplo, en:

union { struct { unsigned char a:4; unsigned char b:4; } bf; unsigned char c; };

Dependiendo de la implementación, la representación de bf.a podría ocupar los cuatro bits superiores de c , o los cuatro bits inferiores de c . Si la ordenación de los miembros del campo de bits coincide con el orden de bytes está definida por la implementación.


El orden de los bits dentro de un byte no tiene sentido, los bits dentro de un byte no son direccionables, por lo que no puede definir un orden de estos bits para usarlos como una referencia para una definición de endianidad. A diferencia de los bits, los bytes son direccionables, por lo que hay un orden de direcciones que podemos usar como referencia para definir lo que significa little o big endian.

Es posible que tenga la impresión de que los operadores de Left shift << o Right Shift >> implican indirectamente que hay un orden definido de bits dentro de un byte, pero eso no es cierto. Estos dos términos se basan en una representación de bytes abstracta en la que el bit más bajo se encuentra a la derecha y los bits aumentan de valor cuando se va a la izquierda, pero por definición el Left shift tiene el mismo efecto que la multiplicación por 2, y el Right shift tiene el mismo efecto como división por 2 (para enteros sin signo).


Esta no es una respuesta a la pregunta planteada (ya ha sido bien respondida por otros), sino una nota al pie que explica algunos de los términos con la esperanza de que aclare los conceptos relacionados. En particular, esto no es específico de c en absoluto.

  • Endianidad y orden de bytes.

    Cuando un valor más grande que el byte se almacena o se serializa en múltiples bytes, la elección del orden en que se almacenan los bytes del componente se denomina orden de bytes , o endian , o endianness .

    Históricamente, ha habido tres órdenes de bytes en uso: " big-endian " , " little-endian " y " PDP-endian " o " PDP-endian " .

    Los nombres de orden de bytes de big-endian y little-endian se derivan de la forma en que ordenan los bytes: big-endian coloca primero el byte más significativo (el byte que más afecta el valor lógico), con los bytes sucesivos en orden decreciente de importancia; y little-endian coloca primero el byte menos significativo, con bytes sucesivos en orden creciente de importancia.

    Tenga en cuenta que el orden de bytes puede diferir para los tipos enteros y los tipos de punto flotante ; Incluso pueden implementarse en unidades de hardware separadas. Sin embargo, en la mayoría de los equipos tienen el mismo orden de bytes.

  • Orden de bits

    El orden de bits es un concepto muy similar al de endianness, excepto que involucra bits individuales en lugar de bytes. Los dos conceptos están relacionados, pero no son lo mismo.

    El orden de los bits solo es significativo cuando los bits se serializan, por ejemplo, a través de un bus serie o SPI o I 2 C; Uno después del otro.

    Cuando se hace referencia a los bits en un grupo más grande utilizado en paralelo, como una unidad , como en un byte o una palabra, no hay orden: solo hay etiquetado y significado . (Es debido a que son accedidos y manipulados como un grupo, en paralelo, en lugar de ser uno por uno, que no hay un orden específico. Su interpretación como un grupo da un significado diferente a cada uno, y los humanos podemos etiquetarlos o numerarlos). facilidad de referencia.)

  • Poco significado

    Cuando un grupo de bits se trata como un valor binario, hay un bit menos significativo y un bit más significativo . Estos nombres se derivan del hecho de que si cambia el bit menos significativo, el valor del grupo de bits cambia en la menor cantidad posible; Si cambia el bit más significativo, el valor del grupo de bits cambia en la mayor cantidad posible (por un solo cambio de bit).

    Digamos que tiene un grupo de cinco bits, digamos a , b , c , d y e , que forman un valor entero sin signo de cinco bits. Si a es el más significativo, y e el menos significativo, y los otros tres están en orden decreciente, el valor entero sin signo es
    valor = a · 2 4 + b · 2 3 + c · 2 2 + d · 2 1 + e · 2 0
    es decir
    valor = 16 a + 8 b + 4 c + 2 d + e

    En otras palabras, el significado de los bits se deriva de la interpretación matemática (o lógica) de un grupo de bits, y está completamente separado del orden en que los bits pueden ser serializados en algún bus, y también de cualquier etiqueta o número asignado por el hombre .

    Esto es cierto para todos los grupos de bits que construyen lógicamente valores numéricos, incluso para números de floating-point .

  • Etiquetas de bits o numeración de bits

    Para facilitar la consulta en la documentación, por ejemplo, a menudo es útil etiquetar los bits individuales. Esto es esencialmente arbitrario; y de hecho, utilicé las letras a a f en un ejemplo anterior. Más a menudo, los números son más fáciles que las letras, no es tan fácil etiquetar más de 27 bits con letras individuales.

    Hay dos enfoques para etiquetar bits con números.

    El más común actualmente es etiquetar los bits de acuerdo con su significado, y el bit 0 se refiere al bit menos significativo. Esto es útil, porque el bit i tiene un valor lógico 2 i .

    En la documentación de ciertas arquitecturas, como la documentación POWER de IBM, el bit más significativo se etiqueta con 0, en orden decreciente de importancia. En este caso, el valor lógico de un bit depende de la cantidad de bits en esa unidad. Si una unidad tiene N bits, entonces el bit i tiene un valor lógico de 2 N -i-1 .

    Si bien este ordenamiento puede parecer extraño, estas arquitecturas son todas de gran tamaño, y puede ser útil para los humanos recordar / asumir que lo más importante es lo primero en estos sistemas.

    Sin embargo, recuerde que esta es una decisión completamente arbitraria y, en ambos casos, la documentación podría escribirse con el otro esquema de etiquetado de bits, sin ningún efecto en el rendimiento real de los sistemas. Es como elegir si se escribe de izquierda a derecha o de derecha a izquierda (o de arriba hacia abajo): los contenidos no se ven afectados, siempre y cuando se conozca y comprenda la convención .

Si bien existe una cierta correlación entre el orden de bytes y el etiquetado de bits, los cuatro conceptos anteriores están separados.

Existe una correlación entre el orden de bytes y el etiquetado de bits, en el sentido de que la documentación de una gran cantidad de hardware de big-endian utiliza el etiquetado de bits donde el bit más significativo es el bit cero, pero eso se debe únicamente a las elecciones hechas por humanos.

En c , el orden en que el compilador de C empaqueta los campos de bits en una estructura, varía entre compiladores y arquitecturas. No está especificado por el estándar C en absoluto. Debido a esto, generalmente es una mala idea leer archivos binarios en un tipo de estructura con campos de bits. (Incluso si funciona en alguna máquina y compilador específicos, no hay garantía de que funcione en otras; a menudo, no lo hace. Por lo tanto, definitivamente hace que el código sea menos portátil.) En su lugar, lea un búfer y una matriz de caracteres unsigned char y use las funciones de acceso auxiliar para extraer los campos de bits de la matriz mediante desplazamientos de bits ( << , >> ), ors binarios ( | ) y enmascaramiento (binario y, & ).


La "endianidad" de un byte en términos de orden de bits no es realmente una preocupación, a menos que esté trabajando con un sistema exótico que le permita tratar los bits por separado. Puede ser una preocupación cuando se decide cómo transmitir datos a través del cable, pero esta decisión generalmente se toma a nivel de hardware.

Audio

En términos de relevancia para la transmisión de audio , bien podría ser importante. El hardware responsable de convertir el flujo de audio digital en señales de audio analógicas puede esperar que los bits en el flujo estén en un orden particular. Si están equivocados, el sonido podría salir completamente golpeado. Tal vez el autor de tu libro elabore sobre esto? De todos modos, como mencioné anteriormente, esto normalmente se decide a nivel de hardware y no es realmente una preocupación cuando se programa a un usuario o incluso a nivel de kernel. En general, los estándares de la industria definirán cómo dos piezas de hardware se transmitirán los datos entre sí. Mientras todo su hardware esté de acuerdo con el bit endianness, entonces todo está bien.

Lectura adicional en Wikipedia.