2012-04-26 58 views
8

我一直在寻找在互联网和无法找到PHP的LZW压缩实现与这些JavaScript函数输出的数据的工作原理: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(""); 
} 

我真的只需要一个PHP中的解压缩算法,可以与上面的压缩javascript函数一起使用。

上述lzw_encode功能编码“这是压缩函数的测试”作为“这一测试ofĈhecomprĊsionfunctěn”

我发现的库或者是越野车(HTTP://代码.google.com/p/php-lzw /)或不输入UTC字符。

任何帮助将不胜感激,

谢谢!

+1

为什么不使用从JS [链接](http://rosettacode.org/wiki/LZW_compression#JavaScript)?在线上已经有了现成的PHP实现。例如:[link](http://webdevwonders.com/lzw-compression-and-decompression-with-javascript-and-php/)。 – BogdanM 2013-09-25 12:14:51

+0

为什么i = 1在这里:'for(var i = 1; i BogdanM 2013-09-25 12:18:47

回答

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 2016-02-18 18:56:08

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 2016-02-23 21:04:34

+0

它是开源的,这是一个半天的努力......如果社区需要表达某些需求,或者随时向我发送拉请求,我会计划添加对字符串的支持;)顺便说一句,它是目前是PHP用户希望进行LZW压缩的最佳选择,即使它迫使您使用文件。 – quickshiftin 2016-02-23 21:07:39