PHP का उपयोग करते हुए LZW जावास्क्रिप्ट स्ट्रिंग संपीड़न और अपघटन

कल ही मैं एक ऐसी स्थिति में आया था कि मैं LZW एल्गोरिथ्म के साथ तारों को संकुचित / विघटित करने के लिए काम करने वाले वर्ग / मॉड्यूल नहीं ढूंढ सका। अधिक सटीक: jsCompress-jsDecompress - काम करता है। PhpCompress-PhpDecompress - काम करता है। लेकिन jsCompress-PhpDecompress या तो कुछ अज्ञात देता है, या एक रिक्त स्ट्रिंग। ईमानदारी से, मुझे पता नहीं है, शायद एएनएसआई के साथ ऐसी कोई समस्या नहीं है, लेकिन utf-8 के साथ यह बहुत स्पष्ट रूप से प्रकट होता है। समस्या को हल करने में कई घंटे बिताने के बाद, मैंने तैयार कार्य को प्रकाशित करने का फैसला किया है।
मैंने यह नहीं बताया कि LZW एल्गोरिथ्म के साथ संपीड़न कैसे काम करता है। विकी में इसका सुंदर वर्णन किया गया है।

तैयार कार्यों और वर्गों को आधार के रूप में लिया गया: PHP के लिए code.google.com/p/php-lzw/ पर और JS gist.github.com/843889 के लिए

जेएस फ़ंक्शन को "जैसा है" छोड़ दिया गया है, अपरिवर्तित है
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(""); } 


लेकिन PHP फ़ंक्शन को थोड़ा ठीक करना पड़ा, क्योंकि LZW एल्गोरिथ्म द्वारा संपीड़ित लाइनों में 255 (ala unicode) से बड़े वर्ण कोड हो सकते हैं, और एक फ़ंक्शन mb_ord को कॉपी-पेस्ट कर सकते हैं, जो इस बहु-स्तरीय चरित्र के लिए एक कोड लौटाएगा।
 function mb_ord($string) { if (extension_loaded('mbstring') === true) { mb_language('Neutral'); mb_internal_encoding('UTF-8'); mb_detect_order(array('UTF-8', 'ISO-8859-15', 'ISO-8859-1', 'ASCII')); $result = unpack('N', mb_convert_encoding($string, 'UCS-4BE', 'UTF-8')); if (is_array($result) === true) return $result[1]; } return ord($string); } function lzw_decompress($binary) { $dictionary_count = 256; $bits = 8; $codes = array(); $rest = 0; $rest_length = 0; mb_internal_encoding("UTF-8"); for ($i = 0; $i < mb_strlen($binary); $i++ ) {$codes[] = mb_ord(mb_substr($binary, $i, 1)); } // decompression $dictionary = range("\0", "\xFF"); $return = ""; foreach ($codes as $i => $code) { $element = $dictionary[$code]; if (!isset($element)) $element = $word . $word[0]; $return .= $element; if ($i) $dictionary[] = $word . $element[0]; $word = $element; } return $return; } 


बेशक, LZW द्वारा संपीड़ित एक स्ट्रिंग के सही संचरण के लिए, इसे ट्रांसमिशन से पहले बेस 64 में एन्कोड किया जाना चाहिए और पैकिंग से पहले डिकोड किया जाना चाहिए। इससे कोई समस्या नहीं होनी चाहिए। PHP की तरफ, सब कुछ सुचारू है, लेकिन जेएस के लिए , इंटरनेट में हर जगह एक ही एल्गोरिदम है

इन कार्यों में कुछ भी नया नहीं है, लेकिन शायद यह लेख किसी और के लिए एक टन समय बचाएगा। क्लाइंट पक्ष पर डेटा को संपीड़ित करने के लिए क्या आवश्यक हो सकता है, मैंने टिप्पणियों में लिखा था।

Source: https://habr.com/ru/post/In152683/


All Articles