PackBits
PackBits är ett snabbt, enkelt förlustfritt komprimeringsschema för körlängdskodning av data.
Apple introducerade PackBits-formatet med lanseringen av MacPaint på Macintosh -datorn. Detta komprimeringsschema kan användas i TIFF -filer. TGA -filer använder också detta RLE-komprimeringsschema, men behandlar dataström som pixlar istället för byte.
En PackBits-dataström består av paket med ett en-byte-huvud följt av data. Rubriken är en signerad byte; data kan vara signerade, osignerade eller packade (som MacPaint-pixlar).
I följande tabell är n värdet på rubrikbyten som ett heltal med tecken.
Rubrikbyte | Data som följer rubrikbyten |
---|---|
0 till 127 | (1 + n ) bokstavliga databytes |
−1 till −127 | En byte data, upprepad (1 − n ) gånger i den dekomprimerade utgången |
−128 | Ingen operation (hoppa över och behandla nästa byte som en rubrikbyte) |
Observera att tolkning av 0 som positiv eller negativ inte gör någon skillnad i utdata. Körningar på två byte intill icke-körningar skrivs vanligtvis som bokstavlig data. Det finns inget sätt baserat på PackBits-data för att bestämma slutet på dataströmmen; det vill säga, man måste redan veta storleken på den komprimerade eller okomprimerade datan innan man läser en PackBits-dataström för att veta var den slutar.
Apple Computer (se den externa länken) ger detta korta exempel på packad data: FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA
Följande kod, skriven i Microsoft VBA , packar upp data:
0
0
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 , " " ) För i = LBound ( File ) To UBound ( File ) Count = Application . Arbetsblad Funktion . Hex2Dec ( File ( i )) Välj Fall Count Case Is >= 128 Count = 256 - Count 'Two's Complement For j = To Count ' 'noll-baserad MyOutput = MyOutput & File ( i + 1 ) & " " Next j i = i + 1 'Justera pekaren Case Else For j = To Count 'nollbaserad MyOutput = MyOutput & File ( i + j + 1 ) & " " Nästa j i = i + j 'Justera pekaren End Välj Next i Debug . Skriv ut 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 AA End Sub
Samma implementering i JavaScript :
0
0
0
0
/** * Hjälpfunktioner för att skapa läsbar in- och utdata * * Se även denna fiol för interaktiv PackBits-avkodare: * https://jsfiddle.net/y13xkh65/3/ */ function str2hex ( str ) { return str . dela ( '' ). map ( function ( char ) { var value = char . charCodeAt ( ); return (( värde < 16 ? '0' : '' ) + värde . toString ( 16 )). toUpperCase (); }). gå med ( ' ' ); } funktion hex2str ( hex ) { returnera hex . dela ( ' ' ). map ( function ( sträng ) { return String . fromCharCode ( parseInt ( sträng , 16 )); }). gå med ( '' ); } /** * PackBits unpack funktion * * @param {String} data * @return {String} */ function unpackBits ( data ) { var output = '' , i = ; while ( i < data . length ) { var hex = data . charCodeAt ( i ); if ( hex == 128 ) { // Gör ingenting, nej } else if ( hex > 128 ) { // Detta är en upprepad byte hex = 256 - hex ; for ( var j = ; j <= hex ; ++ j ) { output += data . charAt ( i + 1 ); } ++ i ; } else { // Dessa är bokstavliga bytes för ( var j = ; j <= hex ; ++ j ) { output += data . charAt ( i + j + 1 ); } i += j ; } ++ i ; } returnera utdata ; } var original = 'FE AA 02 80 00 2A FD AA 03 80 00 2A 22 F7 AA' , data = unpackBits ( hex2str ( original )); // Utdata är: AA AA AA 80 00 2A AA AA AA AA 80 00 2A 22 AA AA AA AA AA AA AA AA AA AA AA konsol . log ( str2hex ( data ));
externa länkar
- Apple-webbsida som beskriver PackBits-formatet
- TIFF PackBits-algoritmen hämtad från webbplatsen https://www.fileformat.info med tillstånd från Corion.net
- PACKBITS-komprimering eller varför vi stöder förlustfri TIFF-komprimeringsmetod? artikeln på webbplatsen https://www.universal-document-converter.com beskriver också algoritmen.