N-Zip Die Textkompression wird derzeit nach der Shannon-Fano-Kodierung durchgeführt. Dabei wird ausgenutzt, dass in der Regel nicht jedes ASCII-Zeichen in einem Text gleich häufig vorkommt. Ein ASCII-Zeichen wird unkomprimiert mit 8 Bit kodiert. Wenn man nun die häufigeren Zeichen mit weniger Bit kodiert und dafür die selteneren Zeichen mit mehr Bit, erreicht man im Durchschnitt weniger Bit pro Zeichen und maximiert so die Entropie.
Diese Methode erfordert, für jede Texteingabe ein eigenes Kodiermuster (Alphabet) zu erstellen und im komprimierten Text mitzuspeichern. Dadurch hat der komprimierte Text immer eine gewisse Mindestlänge, so dass bei sehr kurzen Texten die Kompression sehr schlecht ist oder der komprimierte Text sogar länger ist als der unkomprimierte. Ansonsten hängt die Kompression nur von der Entropie ab, d.h. sie ist gut, wenn nur wenige Zeichen fast den gesamten Text ausmachen. Sich wiederholende Muster werden jedoch nicht berücksichtigt.
Die maximal mögliche Kompression beträgt 12,5% der Originallänge (1 Bit statt 8 Bit pro Zeichen). Der Wert "Intern" gibt die theoretische Kompression auf Bit-Ebene an. Der tatsächliche Wert ist größer durch das mitgespeicherte Alphabet und die Darstellung des komprimierten Textes (eigentlich eine Bitfolge) durch ASCII-Zeichen.
Anführungszeichen und Backslashes (" und \) sollten vermieden werden, da sie automatisch durch einen Backslash geschützt werden (die Funktion wird dadurch aber nicht beeinträchtigt). Die maximale Eingabelänge beträgt 10000 Zeichen.

Komprimieren:

'; if($textinput != "") { //Häufigkeitsverteilung der Zeichen feststellen und sortieren $textlen = strlen($textinput); $distrib = count_chars($textinput,1); arsort($distrib); //Shannon-Fano-Baum erzeugen $sftree = makesftree(array($distrib)); //Alphabet erzeugen $alphabet = sft_alphabet($sftree); //Text formatieren $hexarray = explode(".",wordwrap(bin2hex($textinput),2,".",1)); for($x=0;$xText: '; if($textlen > 88) { echo '
'; } echo wordwrap($textinput,91,"
",1) . '

'; echo 'Länge: ' . $textlen . '

'; echo 'Shannon-Fano-Baum:

'; print_tree($sftree); echo '

'; echo ''; echo '
Häufigkeiten:Alphabet:
'; while(list($key, $val) = each($distrib)) { echo chr($key) . ': ' . $val . ', ' . round(100*$val/$textlen,2) . '%
'; } echo '
'; reset($alphabet); while(list($key, $val) = each($alphabet)) { echo chr($key) . ' => ' . $val . '
'; } echo '
'; echo 'Komprimierter Binärtext:
' . wordwrap($zippedbin,91,"
",1) . '

'; echo 'Header: ' . $header . '

'; */ //DEBUG END ////////////////////////////////////////// $output = $header . "ì" . bin_code($zippedbin,"encode"); $bpc = bitsperchar($alphabet,$distrib); echo '
Komprimierter Text: '; if(strlen($output) > 83) { echo '
'; } echo wordwrap($output,86,"
",1) . '

'; echo 'Länge Original: ' . $textlen . '
Länge Komprimiert: ' . strlen($output) . '

'; echo 'Kompression: ' . round(100*strlen($output)/$textlen,2) . '% (Intern: ' . round(100*$bpc/8,2) . '%)
'; echo 'Bit pro Zeichen: ' . round($bpc,2) . '
'; } echo '


Dekomprimieren:

'; if($compressed != "") { //Header und Text trennen $compressed = stripshit2($compressed); $temparray = explode("ì",$compressed); $header = array_shift($temparray); $zippedtext = join("ì",$temparray); //Alphabet rekonstruieren $alphacrypted = explode("ë",$header); for($i=0;$i 0) { reset($alphabet); while(list($key,$val) = each($alphabet)) { if(strncmp($bintext,$val,strlen($val)) == 0) { $bintext = substr($bintext,strlen($val)); if(!$bintext) $bintext = ""; $decompressed .= chr($key); break; } } } echo '
Dekomprimierter Text: '; if(strlen($decompressed) > 84) { echo '
'; } echo wordwrap($decompressed,91,"
",1) . '

'; echo 'Länge Original: ' . strlen($decompressed) . '
Länge Komprimiert: ' . strlen($compressed) . '

'; echo 'Kompression: ' . round(100*strlen($compressed)/strlen($decompressed),2) . '%
'; } ?>