2012-04-26 11 views
8

मैं इन्टरनेट पर देख रहा था और PHP में एक LZW विसंपीड़न कार्यान्वयन कि डेटा इन जावास्क्रिप्ट कार्यों द्वारा outputted साथ काम करता है नहीं पा सके:पीएचपी 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 में डिकंप्रेशन एल्गोरिदम जो उपरोक्त संपीड़न जावास्क्रिप्ट फ़ंक्शन के साथ काम कर सकता है।

lzw_encode समारोह ऊपर encodes के रूप में "यह संपीड़न समारोह का एक परीक्षण है"

पुस्तकालयों मैंने पाया या तो गाड़ी (http रहे हैं "यह एक परीक्षण ofĈhe comprĊsion functěn एक": // कोड .google.com/p/php-lzw /) या यूटीसी अक्षरों का इनपुट न लें।

किसी भी मदद की सराहना की जाएगी,

धन्यवाद!

+1

जेएस का उपयोग [लिंक] (http://rosettacode.org/wiki/LZW_compression#JavaScript) से क्यों नहीं करें? उस ऑनलाइन के लिए तैयार PHP कार्यान्वयन तैयार हैं। उदाहरण: [लिंक] (http://webdevwonders.com/lzw-compression-and-decompression-with-javascript-and-php/)। – BogdanM

+0

मैं यहां = 1 क्यों है: '(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

यह ओपन सोर्स है और यह आधा दिन का प्रयास है ... यदि समुदाय द्वारा व्यक्त की गई कुछ ज़रूरत है, तो मुझे तारों के लिए समर्थन जोड़ने की योजना होगी, या मुझे एक पुल अनुरोध भेजने में संकोच न करें;) वैसे, यह है फिलहाल सबसे अच्छा विकल्प PHP उपयोगकर्ताओं के लिए उपलब्ध है जो LZW संपीड़न चाहते हैं, भले ही यह आपको फ़ाइलों का उपयोग करने के लिए मजबूर करता हो। – quickshiftin