2010-10-08 17 views
8

Wiem, że format pliku WAV wykorzystuje liczby całkowite ze znakiem dla 16-bitowych próbek. Przechowuje je również w kolejności małego endianu, co oznacza, że ​​najniższe 8 bitów jest pierwsze, następne itd. Jest to bit znaku specjalnego na pierwszym bajcie lub bit znaku specjalnego zawsze na najbardziej znaczącym bit (najwyższa wartość) ?Little-Endian Signed Integer

Znaczenie:
Który z nich jest bitem znaku w formacie WAV?

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

i lub p?

+1

Co do twojego zdjęcia, to zależy od tego, jak narysujesz bity w bajcie. : P Jeśli narysujesz je jako big-endian (najpierw high-endian), wtedy będzie to "i". Jeśli przyjmiesz małą endianię tego wszystkiego, wtedy "p". Tak czy inaczej, będzie to najwyższy bit ostatniego bajtu. – cHao

Odpowiedz

9

bit znaku jest najbardziej znaczący bit na każdej maszynie uzupełnienie do dwóch (jak x86), a więc będzie w ostatnim bajcie w formacie little-endian

Just Cause I nie chciał być nie w tym sztuki 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 -----^ 

Bity są zasadniczo reprezentowane „wstecz” od tego, jak większość ludzi myśli o nich, dlatego też bajt jest ostatnim. Ale wszystko jest spójne; "bit 15" przychodzi po "bit 0", tak jak adresy powinny działać, i nadal jest najbardziej znaczącym bitem najbardziej znaczącego bajtu tego słowa. Nie musisz nic robić, ponieważ sprzęt mówi w kategoriach bajtów na wszystkich, ale najniższych poziomach - więc kiedy czytasz bajt, wygląda dokładnie tak, jak byś tego oczekiwał. Po prostu spójrz na najbardziej znaczącą część twojego słowa (lub ostatni bajt, jeśli czytasz bajt na raz), i masz swój znak.

Należy jednak zauważyć, że dopełnienie dwóch nie określa dokładnie danego bitu jako "bitu znaku". To bardzo wygodny efekt uboczny tego, jak liczby są reprezentowane. W przypadku liczb 16-bitowych -x jest równe 65536-x zamiast 32768 + x (co miałoby miejsce, gdyby bit wyższego rzędu był wyłącznie znakiem).

+3

Jeśli czytasz rzeczywiste bajty zamiast reprezentacji ASCII, to tak - niższe 8 bitów (a więc LSB) będzie zawsze * zawsze pierwszym bajtem, a górne 8 (włącznie z MSB) * zawsze * bądź ostatni - to znaczy "mały endianin". Ale bity w bajcie są przechowywane, ale sprzęt chce je przechowywać. Nie musisz wiedzieć, czy to działa, chyba że budujesz dysk twardy. – cHao

+0

Mówię o tym, jak jest przechowywany w formacie pliku WAV, a nie w sprzęcie. Przeczytałem, że próbki są przechowywane jako małe, 16-bitowe liczby całkowite z endianami. –

+0

Są. A to po prostu jest dość podobne do sposobu, w jaki procesory x86 obsługują wartości 16-bitowe, i dlatego są przechowywane w ten sposób. (Windows został stworzony dla procesorów zgodnych z x86.) Tak czy inaczej, bit znaku jest najbardziej znaczącym bitem ostatniego bajtu wartości, jak wspomniano powyżej. Jeśli 'byte2 & 0x80' jest niezerowe, to twój numer jest ujemny. – cHao

9

podpisane int, mały 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 

Wystarczy tylko przejmuj się, że podczas czytania/pisania short int niektórych nośnikach zewnętrznych. W twoim programie bit znaku jest najbardziej znaczącym bitem w skrócie, bez względu na to, czy jesteś na dużej lub małej platformie endian.