PackBits

PackBits är ett snabbt, enkelt förlustfritt komprimeringsschema för körlängdskodning av data.

Apple introducerade PackBits-formatet med lanseringen av MacPaint 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