PHP LZW二进制解压函数

8

我在互联网上搜索了很久,但没有找到一个能够处理这些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("");
}

我只需要一个能够与上述压缩JavaScript函数一起使用的PHP解压算法。
上面的lzw_encode函数将“ This is a test of the compression function”编码为“ This Ă a test ofĈhe comprĊsion functěn”。
我找到的库要么存在错误(http://code.google.com/p/php-lzw/),要么不能接受UTC字符作为输入。
非常感谢您的帮助,谢谢!

1
为什么不使用链接中的JS?网上已经有现成的PHP实现了。例如:链接 - BogdanM
为什么这里是 i=1:for (var i=1; i<data.length; i++) {?难道不应该是0吗? - BogdanM
2个回答

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

现在有一个PHP扩展可以实现这个功能!

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');

这很好,但可能有点难以使用,因为它强制使用文件。它不能只解压缩数据字符串。它还需要一个正确的.Z文件格式(那三个字节在开头)。 - Veda
它是开源的,只需要半天的工作量...如果社区有需求表达,我会计划添加对字符串的支持,或者随时欢迎您发送拉取请求 ;) 顺便说一下,即使它强制您使用文件,但目前它仍然是PHP用户想要LZW压缩的最佳选择。 - quickshiftin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接