2012-04-26 99 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