2012-04-26 22 views
8

Ben internets arıyordum ve bu javascript fonksiyonları tarafından çıkış verileri ile çalışır PHP'de bir LZW dekompresyon uygulaması bulamadık:PHP LZW İkili Basınç Fonksiyonu

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

Ben gerçekten sadece bir ihtiyaç PHP'deki sıkıştırma javascript işleviyle çalışabilen dekompresyon algoritması.

lzw_encode fonksiyonu yukarıda kodlar

olarak "Bu sıkıştırma fonksiyonu bir testtir"

buldum kütüplarine (http ya vardır "Bu bir denemedir ofĈhe comprĊsion functěn a": // kod .google.com/p/php-lzw /) veya UTC karakterlerinin girişini almayın.

Herhangi bir yardım büyük takdir,

teşekkürler!

+1

Neden JS'yi [link] 'den (http://rosettacode.org/wiki/LZW_compression#JavaScript) kullanmıyorsunuz? Bu çevrimiçi için hazır PHP uygulamaları var. Örneğin: [link] (http://webdevwonders.com/lzw-compression-and-decompression-with-javascript-and-php/). – BogdanM

+0

Neden i = 1 burada: 'için (var i = 1; i BogdanM

cevap

3

ben taşıdık ve PHP sizin için test ettik:

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

Bunu denediğimde bir sürü hata mesajı aldım. – quickshiftin

0

Orada şimdi bunun için bir 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

Bu güzel, ama kullanımı zor olabilir, çünkü dosya kullanımını zorlar. Sadece bir veri dizisini açamaz. Aynı zamanda uygun bir .Z dosya formatı gerektirir (başlangıçta bu 3 bayt). – Veda

+0

Açık kaynak kodlu bir kaynaktır ve yarım günlük bir çabadır. Topluluk tarafından dile getirilen bazı ihtiyaçlar varsa diziler için destek ekleyeceğim veya bana bir çekme isteği göndermekten çekinmeyeceğim;) Bu arada, Şu anda, dosyaları kullanmanıza zorlasa bile, LZW sıkıştırmasını isteyen PHP kullanıcıları için mevcut en iyi seçenek. – quickshiftin