2012-04-26 21 views
8

私はのインターネット上で探していたし、これらのjavascript機能により出力されたデータで動作するPHPでLZW圧縮解除の実装を見つけることができませんでした:PHP LZWバイナリ解凍機能

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(""); 
} 

私は本当にただ必要上記の圧縮javascript関数で動作するPHPの解凍アルゴリズム。 //コード:上記

lzw_encode機能は、私が見つけた

ライブラリはバギー(HTTPのどちらかである「これはテストofĈhecomprĊsionのfunctěnをA」として「これは圧縮機能のテストである」コード.google.com/p/php-lzw /)、またはUTC文字を入力しないでください。

任意の助けをいただければ幸いです、

ありがとう!

+1

[link](http://rosettacode.org/wiki/LZW_compression#JavaScript)のJSを使用しないのはなぜですか?オンラインのための準備ができたPHP実装があります。例:[リンク](http://webdevwonders.com/lzw-compression-and-decompression-with-javascript-and-php/) – BogdanM

+0

なぜここでi = 1ですか?for(var i = 1; i BogdanM

答えて

3

私が移植され、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

これを試してみたら、私はたくさんのエラーメッセージを受け取りました。 – quickshiftin

0

あり、今あるこのためPHP extension

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

これはいいですが、ファイルの使用を強制するので、少し使いにくいかもしれません。それは単にデータ列を解凍することはできません。また、適切な.Zファイル形式(最初の3バイト)も必要です。 – Veda

+0

オープンソースで、半日の努力です...コミュニティによって表現される必要がある場合は文字列のサポートを追加する予定です、またはプルリクエストを私に送信してください);ところで、それは現在のところ、LZW圧縮を望んでいるPHPユーザーにとっては、ファイルを使用する必要があっても、現在のところ最高のオプションです。 – quickshiftin