2012-04-26 14 views
8

Ich habe auf dem Internets gesucht und konnte keine LZW-Dekompression Implementierung in PHP finden, die von diesen JavaScript-Funktionen mit den Daten ausgegeben funktioniert:PHP LZW Binary Dekomprimierungsfunktion

function lzw_encode(s) { 
    var dict = {}; 
    var data = (s + "").split(""); 
    var out = []; 
    var currChar; 
    var phrase = data[0]; 
    var code = 256; 
    for (var i=1; i<data.length; i++) { 
     currChar=data[i]; 
     if (dict[phrase + currChar] != null) { 
      phrase += currChar; 
     } 
     else { 
      out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); 
      dict[phrase + currChar] = code; 
      code++; 
      phrase=currChar; 
     } 
    } 
    out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0)); 
    for (var i=0; i<out.length; i++) { 
     out[i] = String.fromCharCode(out[i]); 
    } 
    return out.join(""); 
} 

function lzw_decode(s) { 
    var dict = {}; 
    var data = (s + "").split(""); 
    var currChar = data[0]; 
    var oldPhrase = currChar; 
    var out = [currChar]; 
    var code = 256; 
    var phrase; 
    debugger; 
    for (var i=1; i<data.length; i++) { 
     var currCode = data[i].charCodeAt(0); 
     if (currCode < 256) { 
      phrase = data[i]; 
     } 
     else { 
      phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar); 
     } 
     out.push(phrase); 
     currChar = phrase.charAt(0); 
     dict[code] = oldPhrase + currChar; 
     code++; 
     oldPhrase = phrase; 
    } 
    return out.join(""); 
} 

ich wirklich nur ein brauchen Dekomprimierungsalgorithmus in PHP, der mit der obigen Komprimierungs-JavaScript-Funktion arbeiten kann.

Die lzw_encode Funktion oben codiert als „Dies ist ein Test der Kompressionsfunktion“ „Dies ist ein Test ein ofĈhe comprĊsion functěn“

Die Bibliotheken, die ich gefunden habe, sind entweder Buggy (http: // Code .google.com/p/php-lzw /) oder keine UTC-Zeichen eingeben.

Jede Hilfe würde sehr geschätzt werden,

Vielen Dank!

+1

Warum nicht die JS von [link] (http://rosettacode.org/wiki/LZW_compression#JavaScript) verwenden? Dafür gibt es fertige PHP-Implementierungen. ZB: [link] (http://webdevwonders.com/lzw-compression-and-decompression-with-javascript-and-php/). – BogdanM

+0

Warum ist i = 1 hier: 'für (var i = 1; i BogdanM

Antwort

3

Ich habe portiert und getestet es für Sie PHP:

function lzw_decode($s) { 
    mb_internal_encoding('UTF-8'); 

    $dict = array(); 
    $currChar = mb_substr($s, 0, 1); 
    $oldPhrase = $currChar; 
    $out = array($currChar); 
    $code = 256; 
    $phrase = ''; 

    for ($i=1; $i < mb_strlen($s); $i++) { 
     $currCode = implode(unpack('N*', str_pad(iconv('UTF-8', 'UTF-16BE', mb_substr($s, $i, 1)), 4, "\x00", STR_PAD_LEFT))); 
     if($currCode < 256) { 
      $phrase = mb_substr($s, $i, 1); 
     } else { 
     $phrase = $dict[$currCode] ? $dict[$currCode] : ($oldPhrase.$currChar); 
     } 
     $out[] = $phrase; 
     $currChar = mb_substr($phrase, 0, 1); 
     $dict[$code] = $oldPhrase.$currChar; 
     $code++; 
     $oldPhrase = $phrase; 
    } 
    var_dump($dict); 
    return(implode($out)); 
} 
+0

Ich habe eine Reihe von Fehlermeldungen erhalten, als ich das versuchte. – quickshiftin

0

Es gibt jetzt eine PHP extension dafür!

lzw_decompress_file('3240_05_1948-1998.tar.Z', '3240_05_1948-1998.tar'); 
$archive = new PharData('/tmp/3240_05_1948-1998.tar'); 
mkdir('unpacked'); 
$archive->extractTo('unpacked'); 
+0

Das ist nett, aber könnte ein bisschen schwierig sein, da es die Verwendung von Dateien erzwingt. Es kann nicht einfach eine Datenkette dekomprimieren. Es erfordert auch ein korrektes .Z-Dateiformat (diese 3 Bytes am Anfang). – Veda

+0

Es ist open source und es ist ein halber Tag Aufwand ... Ich werde planen, Unterstützung für Strings hinzuzufügen, wenn es ein Bedürfnis gibt, das von der Community ausgedrückt wird, oder zögern Sie nicht, mir eine Pull-Anfrage zu senden;) Übrigens ist es Derzeit die beste Option für PHP-Benutzer, die eine LZW-Komprimierung wünschen, auch wenn Sie gezwungen sind, Dateien zu verwenden. – quickshiftin