Bzip2
# Bzip2

bzip2 ist ein freies Komprimierungsprogramm zur verlustfreien Kompression von Dateien, entwickelt von Julian Seward. Es ist frei von jeglichen patentierten Algorithmen und wird unter einer BSD-ähnlichen Lizenz vertrieben.

Bzip2 komprimiert Daten in einem dreistufigen Verfahren: Zuerst werden die Eingangsdaten blockweise mit der umkehrbaren Burrows-Wheeler-Transformation sortiert. Das Ergebnis wird dann einer Move-to-Front-Transformation unterzogen. Deren Ergebnis wird dann schließlich einer Huffman-Kodierung unterzogen, die die eigentliche Datenkompression vornimmt.

Die Kompression mit bzip2 ist oft effektiver, aber meist erheblich langsamer als die Kompression mit gzip oder rar. Seit 2003 existiert jedoch auch die Variante pbzip2, die Multi-Threading beherrscht und auf aktuellen Mehrkernprozessoren erheblich schneller ist. pbzip zerlegt hierfür den Eingabedatenstrom in mehrere einzelne Ströme, welche separat komprimiert werden. Das Ergebnis ist eine Datei, welche die konkatenierten Bzip-Ströme enthält.

Mit bzip2 komprimierte Dateien werden durch die Dateiendung .bz2 gekennzeichnet. tar-Dateien, die mit bzip2 komprimiert wurden, haben üblicherweise die Erweiterung .tar.bz2 oder .tbz2. Ein Vorteil solcher mit bzip2 komprimierter tar-Dateien ist, dass sich bei Lesefehlern oder Beschädigungen alle noch lesbaren Blöcke mittels bzip2recover herauskopieren und anschließend entpacken lassen, während andere Kompressionsverfahren nach einem Lesefehler nicht weiterarbeiten können.

bzip2 ist der Nachfolger von bzip, das ursprünglich arithmetisches Kodieren nach dem Blocksort benutzte; aus patentrechtlichen Gründen wurde bzip jedoch nicht mehr weiterentwickelt.

## libbzip2

Das Kommandozeilenprogramm bzip2 benutzt für die eigentliche Kompressions- und Dekompressionsarbeit eine Programmbibliothek namens libbzip2, welche auch von anderen Programmen, die das bz2-Dateiformat lesen und schreiben können, verwendet wird.

Diese Programmbibliothek bietet Funktionen, um beliebige Daten im Hauptspeicher zu komprimieren, und eine stdio-ähnliche Schnittstelle zum Lesen und Schreiben von bz2-komprimierten Dateien.

## Dateiformat

Ein .bz2 Datenstrom beginnt mit einer Signatur (4 Byte), gefolgt von Null oder mehr komprimierten Blöcken, direkt anschließend folgt ein End-of-Stream-Marker und ein CRC (32-Bit) für den Ursprungsinhalt der ganzen Datei. Die komprimierten Blöcke sind Bit-aligned (kein Padding).

| VarName | Bits | Description |
| - | - | - |
| Header |
| .magic | 2 *8 | 'BZ' signature/magic number |
| .version | 1 *8 | 'h' for Bzip2 ('H'uffman coding), '0' for Bzip1 (deprecated) |
| .hundred_k_blocksize | 1 *8 | '1'..'9' block-size 100 kB .. 900 kB (uncompressed) |
| Blocks 1..n |
| .compressed_magic | 6 *8 | '1AY&SY' -> 0x314159265359 (BCD (Pi)) |
| .crc | 4 *8 | checksum for this block |
| .randomised | 1 (! Bit) | 0 => normal, 1 => randomised (deprecated) |
| .origPtr | 3 *8 | starting pointer into BWT for after untransform |
| .huffman_used_map | 2 *8 | bitmap for following 'huffman_used_bitmaps', of ranges of 16 bytes, present/not present |
| .huffman_used_bitmaps | (0..32) *8 | bitmap, of symbols used, present/not present (multiples of 16) |
| .huffman_groups | 3 | 2..6 number of different Huffman tables in use |
| .selectors_used | 15 | number of times that the Huffman tables are swapped (each 50 bytes) |
| *.selector_list | 1..6 | zero-terminated bit runs (0..62) of MTF'ed Huffman table (*selectors_used) |
| .start_huffman_length | 5 | 0..20 starting bit length for Huffman deltas |
| *.delta_bit_length | (1..5) *8 | 0 => next symbol; 1 => alternated length { 1 => decrement length; 0 => increment length } ( *(symbols + 2) * groups ) |
| .contents | 2..900 KB | Huffman encoded data stream until end of block (max. 900 * 1024 * 8 => 7372800 bit) |
| .eos_magic | 6 *8 | \x17 'rE8P' \x90 -> 0x177245385090 (BCD sqrt(pi)) |
| End |
| .crc | 4 *8 | checksum for whole stream |
| .padding | 0..7 | align to whole byte |
