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