PackBity
PackBits to szybki, prosty schemat bezstratnej kompresji do kodowania danych w pełnej długości .
Firma Apple wprowadziła format PackBits wraz z wydaniem programu MacPaint na komputerze Macintosh . Ten schemat kompresji może być używany w plikach TIFF . Pliki TGA również używają tego schematu kompresji RLE, ale traktują strumień danych jako piksele zamiast bajtów.
Strumień danych PackBits składa się z pakietów z jednobajtowym nagłówkiem, po którym następują dane. Nagłówek jest bajtem ze znakiem; dane mogą być podpisane, niepodpisane lub spakowane (na przykład piksele MacPaint).
W poniższej tabeli n jest wartością bajtu nagłówka jako liczbą całkowitą ze znakiem.
Bajt nagłówka | Dane następujące po bajcie nagłówka |
---|---|
od 0 do 127 | (1 + n ) dosłowne bajty danych |
od -1 do -127 | Jeden bajt danych, powtórzony (1 − n ) razy w zdekompresowanym wyjściu |
−128 | Brak operacji (pomiń i traktuj następny bajt jako bajt nagłówka) |
Zauważ, że interpretacja 0 jako dodatniej lub ujemnej nie ma wpływu na wynik. Przebiegi dwóch bajtów sąsiadujących z nieuruchamianymi są zwykle zapisywane jako dane literalne. Nie ma sposobu na podstawie danych PackBits, aby określić koniec strumienia danych; to znaczy, trzeba już znać rozmiar skompresowanych lub nieskompresowanych danych przed odczytaniem strumienia danych PackBits, aby wiedzieć, gdzie się kończy.
Apple Computer (patrz łącze zewnętrzne) udostępnia ten krótki przykład spakowanych danych: FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA
Poniższy kod, napisany w Microsoft VBA , rozpakowuje dane:
Sub UnpackBitsDemo () Dim File As Variant Dim MyOutput As String Dim Count As Long Dim i As Long , j As Long File = "FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA" File = Split ( File , " " ) For i = LBound ( Plik ) Do
0
Liczba UBound ( plików ) = aplikacja . Funkcja arkusza roboczego . Hex2Dec ( File ( i )) Select Case Count Case Is >= 128 Count = 256 - Count „Dopełnienie do dwóch dla j = To Count ” od zera MyOutput = MyOutput & File ( i
0
+ 1 ) & " " Dalej j i = i + 1 'Dostosuj wskaźnik Case Else For j = To Count ' od zera MyOutput = MyOutput & File ( i + j + 1 ) & " " Next j i = i + j 'Wyreguluj wskaźnik
Koniec Wybierz Dalej i Debuguj . Print MyOutput 'AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA Koniec Sub
Ta sama implementacja w JavaScript :
0
/** * Funkcje pomocnicze do tworzenia czytelnych danych wejściowych i wyjściowych * * Zobacz także ten fiddle dla interaktywnego dekodera PackBits: * https://jsfiddle.net/y13xkh65/3/ */ function str2hex ( str ) { return str . podzielić ( '' ). map ( funkcja ( char ) { var wartość = char . charCodeAt ( ); return ((
wartość < 16 ? '0' : '' ) + wartość . do Ciągu ( 16 )). na wielkie litery (); }). dołącz ( '' ); } funkcja hex2str ( hex ) { return hex . podzielić ( ' '' ). mapa ( funkcja ( string ) {
0
zwróć ciąg znaków . fromCharCode ( parseInt ( string , 16 )); }). dołącz ( '' ); } /** * PackBits unpack function * * @param {String} data * @return {String} */ function unpackBits ( dane ) { var output = '' , i = ; podczas ( tj
0 < dane . długość ) { var hex = dane . charCodeAt ( i ); if ( hex == 128 ) { // Nic nie rób, nop } else if ( hex > 128 ) { // To jest powtórzony bajt hex = 256 - hex ; dla ( var j = ; j
0
<= szesnastkowy ; ++ j ) { wyjście += dane . charAt ( i + 1 ); } ++ ja ; } else { // To są dosłowne bajty for ( var j = ; j <= hex ; ++ j ) { output += data . charAt ( i + j
+ 1 ); } ja += j ; } ++ ja ; } zwróć dane wyjściowe ; } var oryginał = 'FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA' , data = unpackBits ( hex2str ( oryginał )); // Dane wyjściowe to: AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA konsola . log ( str2hex ( dane ));
Linki zewnętrzne
- Strona internetowa firmy Apple opisująca format PackBits
- Algorytm TIFF PackBits zaczerpnięty z witryny https://www.fileformat.info za zgodą firmy Corion.net
- Kompresja PACKBITS, czyli dlaczego obsługujemy bezstratną metodę kompresji TIFF? artykuł na stronie https://www.universal-document-converter.com również opisuje algorytm.