2010-04-14 7 views
6

Estoy leyendo un archivo byte a byte.ordenación de bits y endianess

Digamos, por ejemplo, tengo este byte: 0x41 (0100 0001) representado en hexadecimal.

Ahora, quiero los primeros tres bits de este byte, es decir (010).

Puedo usar la lógica bit a bit para extraer los primeros tres bits, pero mi pregunta es si los primeros tres bits serán independientes de la endiabilidad de la máquina (es decir, no pueden ser 001).

Gracias,

+0

Los bits generalmente se cuentan desde la derecha, por lo que 010 serían los últimos tres bits en su ejemplo. Menciono esto porque creo que la mayoría de los documentos sobre manipulación de bits consideran que los bits más bajos, los bits que representan 1, 2, 4, ... son los primeros bits. –

+0

No existe una convención universal sobre el orden de bits dentro de una palabra. En la práctica, depende para lo que lo está usando. Si está haciendo aritmética de múltiples palabras, el orden natural es primero LSB. Sin embargo, para calcular un CRC para un paquete TCP/IP, primero MSB tiene más sentido. – comingstorm

Respuesta

7

Otra forma de pensar esto es que la endianidad solo se aplica cuando puede leer los componentes de un elemento individualmente, ya que normalmente puede leer independientemente de la memoria los bytes individuales de un int de 32 bits, si quiere interpretarlos bytes como un int de 32 bits no necesita asegurarse de que se tenga en cuenta la endiabilidad de la arquitectura.

Normalmente no puede leer de memoria los bits individuales de un byte, por lo que realmente no existe el concepto de 'bit endianness' en lo que respecta a la arquitectura de memoria (estoy seguro de que hay hardware, pero no es algo que puedas ver a nivel de software). Unas pocas áreas en las que pueda necesitar para hacer frente a (o por lo menos ser conscientes de) poco endianness:

  1. el fin de que el compilador almacena bits de un campo de bits es compilador dependiente (y no está necesariamente relacionada a la Endianess de la plataforma de hardware: diferentes compiladores pueden ordenar campos de bits de forma diferente para la misma plataforma. Es posible que un compilador se pueda configurar de una forma u otra usando opciones de línea de comando, similar a la manera en que char se puede configurar como firmado o sin firmar. . Sin embargo, los campos de bits C realmente no tienen nada que ver con el direccionamiento de hardware.

  2. algunas arquitecturas de hardware le permiten abordar bits individuales (el ARM Cortex M3, por ejemplo), por lo que en este caso necesitaría saber cómo abordar la arquitectura arreglada para bits si fuera a usar esa característica .

  3. si está enviando bits a través de un enlace en serie: la interfaz de hardware especificará normalmente si el bit más significativo o el bit menos significativo se 'desplaza' primero en el cable.

7

Endianness sólo se aplica al orden de bytes, no bit de orden. El orden de los bits será el mismo dentro del byte correspondiente.

3

Sí, serán lo mismo.

La ordenación de bits dentro de bytes generalmente es solo un problema cuando se está realizando una operación de E/S bit a bit, por ejemplo, cuando se lee una secuencia de datos enviados a través de una línea serie. Esos realmente envían un bit a la vez, por lo que el remitente y el receptor deben acordar si los bits se envían de izquierda a derecha o de derecha a izquierda, para cada byte.

Para archivos y accesos en memoria, el orden de bits dentro de bytes no cambia.

1

Un poco confuso :-). Excepto en la comunicación serial, el término "primer bit" no tiene significado, solo hay bits más a la izquierda (más significativos) y más a la derecha (menos significativos). Si alguien te dijo que extraigas "los primeros tres bits", dales una bofetada y pregunta qué significan. Incluso el término "Bit 0" es ambiguo, a menudo significa el bit menos significativo y más a la derecha (el 2 ** 0 bit) pero casi con la misma frecuencia se utiliza para significar el bit más significativo, más a la izquierda en algún campo de bits .Qué bit es el "primer" bit en un byte depende completamente de lo que está haciendo con los bits.

1

Los operadores bit a bit en C se definen para trabajar en los valores . La expresión 0x41U >> 5 siempre dará el valor 2 (en binario, 010).

0

El orden de los bits es importante cuando un campo utiliza parte de un byte, o abarca los bytes que comienzan o terminan (o ambos) en parte a través de un byte.

Ejemplo: 2 bytes de datos primero 235 (decimal) segundo 173 (decimal), también conocido como hex EB y AD.

Quiero un campo de bit que comienza en el cuarto bit, hasta el 12º bit. Por lo tanto, omita más de 3 bits, haga un entero sin signo de 9 bits de los siguientes 9 bits.

reclamo hay 4 posibles resultados:

 
    byteOrder, bitOrder 

* bigEndian, bigEndian results in hex 0BA or decimal 186 
* littleEndian, littleEndian results in hex 1BD or decimal 445 
* littleEndian, bigEndian results in hex 05D or decimal 93 
* bigEndian, littleEndian results in hex 1DE or decimal 478 

que he visto el primero de éstos 3 4 en los datos. grande, grande y pequeño, son fáciles de resolver.

Sugerencia para tratar con esto.

Si el orden de bytes es big endian, anote los bytes de la izquierda hacia la derecha. Si el orden de bytes es poco endian, anote los bytes de la derecha hacia la izquierda.

Cuestiones relacionadas