2010-10-08 30 views
8

Sé que el formato de archivo WAV utiliza enteros con signo para muestras de 16 bits. También los almacena en orden little-endian, lo que significa que los 8 bits más bajos son los primeros, luego los siguientes, etc. Es el bit de signo especial en el primer byte, o el bit de signo especial siempre en el bit más significativo (valor más alto) ?Entero con signo Little-Endian

Significado:
¿Cuál es el bit de signo en el formato WAV?

++---+---+---+---+---+---+---+---++---+---+---+---+---+---+---+---++ 
|| a | b | c | d | e | f | g | h || i | j | k | l | m | n | o | p || 
++---+---+---+---+---+---+---+---++---+---+---+---+---+---+---+---++ 
--------------------------- here ->^------------- or here? ->^

i or p?

+1

En cuanto a su imagen, depende de cómo dibuje los bits dentro del byte. : P Si los dibujas como un big-endian (primero un poco alto), entonces será "i". Si abrazas el pequeño endianismo de todo, entonces "p". De cualquier manera, será la parte más alta del último byte. – cHao

Respuesta

9

El bit de signo es el bit más significativo en cualquier máquina en complemento a dos (como el 86), y por lo tanto estará en el último byte en un formato little-endian

Sólo porque yo no quería sea ​​el que no incluye el arte ASCII ... :)

+---------------------------------------+---------------------------------------+ 
|    first byte    |    second byte    | 
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ 
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ 
    ^--- lsb            msb/sign bit -----^ 

los bits se representan básicamente "hacia atrás" de cómo la mayoría de la gente piensa acerca de ellos, por lo que el byte alto es pasado. Pero todo es consistente; "bit 15" viene después de "bit 0" así como las direcciones deberían funcionar, y sigue siendo el bit más significativo del byte más significativo de la palabra. No tiene que hacer ningún truco, porque el hardware habla en términos de bytes, pero en los niveles más bajos, por lo que cuando lee un byte, se ve exactamente como se espera. Solo mira la parte más significativa de tu palabra (o el último byte de ella, si estás leyendo un byte a la vez), y ahí está tu signo de bit.

Tenga en cuenta, sin embargo, que el complemento a dos no designa exactamente un bit en particular como el "bit de signo". Eso es solo un efecto secundario muy conveniente de cómo se representan los números. Para números de 16 bits, -x es igual a 65536-x en lugar de 32768 + x (que sería el caso si el bit superior fuera estrictamente el signo).

+3

Si está leyendo bytes reales en lugar de una representación ASCII, entonces sí: los 8 bits más bajos (y por lo tanto, el LSB) serán * siempre * el primer byte, y los 8 superiores (MSB incluidos) * siempre * ser el último - eso es lo que significa "pequeño endian". Pero los bits dentro del byte se almacenan sin embargo el hardware quiere almacenarlos. No tiene que saber o preocuparse de cómo funciona eso a menos que esté construyendo un disco duro. – cHao

+0

Estoy hablando de cómo se almacena en el formato de archivo WAV, no en el hardware. Leí que las muestras se almacenan como pequeños enteros de 16 bits firmados por Endian. –

+0

Ellos son. Y eso sucede bastante cerca de la forma en que los procesadores x86 manejan los valores de 16 bits, razón por la cual están almacenados de esa manera. (Windows se creó para CPU compatibles con x86). De cualquier forma, el bit de signo es el bit más significativo del último byte del valor, como se mencionó anteriormente. Si 'byte2 & 0x80' es distinto de cero, entonces tu número es negativo. – cHao

9

firmaron int, Little Endian:

 
byte 1(lsb)  byte 2(msb) 
--------------------------------- 
7|6|5|4|3|2|1|0 | 7|6|5|4|3|2|1|0| 
---------------------------------- 
       ^
        | 
       Sign bit 

Sólo tiene que preocuparse por que cuando la lectura/escritura de un short int a algunos medios de comunicación externos. Dentro de tu programa, el bit de signo es el bit más significativo en el corto, sin importar si estás en una plataforma grande o pequeña endian.

Cuestiones relacionadas