जावास्क्रिप्ट Gzip के कार्यान्वयन [बंद]


208

मैं एक वेब एप्लिकेशन लिख रहा हूं, जिसमें AJAX (सोच: Opensocial कोटा ) के माध्यम से JSON डेटा को एक छोटे, निश्चित आकार के सर्वर-साइड कैश में संग्रहीत करने की आवश्यकता है । सर्वर पर मेरा नियंत्रण नहीं है।

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

हालाँकि, मैं Gzip के जावास्क्रिप्ट कार्यान्वयन के रास्ते में बहुत कुछ नहीं पा सकता हूँ। इसे भेजने से पहले मैं ग्राहक की ओर से डेटा को कैसे संपीड़ित कर सकता हूं, इसके लिए कोई सुझाव?


6
आप इसे सर्वर तक भेज रहे हैं । इसलिए "अपलोड" और "डाउनलोड" की धारणाएं हैं। शायद इसलिए आपको जवाब मिल रहा है जो आपको बताता है कि "सर्वर यह कर सकता है"।
तोमलक

3
इसका एक उचित कार्यान्वयन शायद मुश्किल है, क्योंकि जावास्क्रिप्ट सिंगल थ्रेडेड है। यह संभवत: सेट टाइमआउट () का उपयोग करके बैचों में संपीड़ित करने के लिए होगा, ताकि यूआई संपीड़ित करते समय लॉक न हो।
अगस्त लिलियास

शायद आप अपना खुद का कम्प्रेशन एल्गोरिथ्म लिख सकते थे
कप्तान kuro

3
@AugustLilleaas अब आप ऐसा करने के लिए वेबवर्क का उपयोग कर सकते हैं :)
कप्तान स्पष्ट

जवाबों:


138

संपादित करें एक बेहतर LZW समाधान हो गया लगता है कि कम से हैंडल यूनिकोड तार सही ढंग से http://pieroxy.net/blog/pages/lz-string/index.html (टिप्पणी में pieroxy के लिए धन्यवाद)।


मैं किसी भी gzip कार्यान्वयन के बारे में नहीं जानता, लेकिन jsolait पुस्तकालय (साइट दूर चला गया है) LZW संपीड़न / अपघटन के लिए कार्य करता है। कोड LGPL के अंतर्गत आता है

// LZW-compress a string
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("");
}

// Decompress an LZW-encoded string
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;
    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("");
}

11
विकिपीडिया के अनुसार, पेटेंट कुछ साल पहले समाप्त हो गया था। हालाँकि यह जाँचना एक अच्छा विचार हो सकता है।
मैथ्यू क्रुमले

3
LZW अभी भी पेटेंट होने के लिए बहुत पुराना है। अंतिम पेटेंट 2003 या उसके बाद भाग गए। मुक्त कार्यान्वयन के भार हैं।
ypnos

5
मैं ऊपर दिए गए कोड के साथ कम से कम दो समस्याओं को देखता हूं: 1) "इस \ u0110 \ u0111 \ u0112 \ u0113 \ u0114 गैर ascii वर्णों को संपीड़ित करने के लिए परीक्षण करने की कोशिश करो।", 2) कोड 65535 के अनुसार कोई त्रुटि की सूचना नहीं है।
कुछ

5
यहाँ 21 विभिन्न भाषाओं में कार्यान्वयन हैं rosettacode.org/wiki/LZW_compression यह लिखा है कि यह 2004 से सार्वजनिक डोमेन में है।
jcubic

5
@some मैंने अभी हाल ही में आपके द्वारा बताई गई समस्याओं को ठीक करने वाला एक छोटा सा लीब जारी किया है: pieroxy.net/blog/pages/lz-string/index.html
pieroxy

53

मुझे एक और समस्या थी, मैं gzip में डेटा एनकोड नहीं करना चाहता था, लेकिन gzipped data को डीकोड करना चाहता था । मैं जावास्क्रिप्ट कोड ब्राउज़र के बाहर चला रहा हूं, इसलिए मुझे शुद्ध जावास्क्रिप्ट का उपयोग करके इसे डीकोड करने की आवश्यकता है ।

मुझे कुछ समय लगा लेकिन मैंने पाया कि JSXGraph लाइब्रेरी में gzipped data पढ़ने का एक तरीका है।

यहां मुझे लाइब्रेरी मिली है: http://jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/ यहां तक ​​कि एक स्टैंडअलोन उपयोगिता है जो कि, JSXCompressor कर सकती है , और कोड LGPL लाइसेंस प्राप्त है।

बस jsxcompressor.js फ़ाइल को अपनी परियोजना में शामिल करें और फिर आप एक आधार 64 एन्कोडेड gzipped डेटा पढ़ सकेंगे:

<!doctype html>
</head>
<title>Test gzip decompression page</title>
<script src="jsxcompressor.js"></script>
</head>
<body>
<script>
    document.write(JXG.decompress('<?php 
        echo base64_encode(gzencode("Try not. Do, or do not. There is no try.")); 
    ?>'));
</script>
</html>

मैं समझता हूं कि यह वह नहीं है जो आप चाहते थे लेकिन मैं अभी भी यहां उत्तर देता हूं क्योंकि मुझे संदेह है कि यह कुछ लोगों की मदद करेगा।


3
अभी भी साझा करने के लिए बहुत बहुत धन्यवाद। मुझे ठीक इसी की आवश्यकता थी। आपने शायद मुझे असफल खोज के घंटे बचाए, जो मैं वास्तव में नहीं छोड़ सकता। +1
किरयूज

1
मुझे आश्चर्य है कि क्यों पृथ्वी पर इसे "कंप्रेसर" कहा जाता है जब यह एक UNcompressor है। lol
मैटियो

1
लगभग 5 साल बाद, अभी भी उपयोगी है। धन्यवाद। मैं AJAX'ing के बजाय सीधे पेज पर एक बड़े JSON डंप कर रहा हूं। PHP के साथ इसे पूर्व-संपीड़ित करके और इसे जावास्क्रिप्ट के ग्राहक पक्ष में वापस घटाकर - मैं कुछ ओवरहेड को बचा रहा हूं।

क्या हमें <?php..थोड़ी जरूरत है ? .. मैं पूछ रहा हूं क्योंकि यह decompressविधि से पारित है ।
Jus12

i get14:16:28.512 TypeError: e.replace is not a function[Weitere Informationen] jsxcompressor.min.js:19:12201
ब्लूसक्रैम

40

हमने अभी pako https://github.com/nodeca/pako , zlib के पोर्ट से जावास्क्रिप्ट को जारी किया । मुझे लगता है कि अब डिफ्लेट / इनफ़्लो / गज़िप / अनगिपिप का सबसे तेज़ js कार्यान्वयन है। इसके अलावा, इसके पास लोकतांत्रिक एमआईटी लाइसेंस है। Pako सभी zlib विकल्पों का समर्थन करता है और यह परिणाम बाइनरी बराबर हैं।

उदाहरण:

var inflate = require('pako/lib/inflate').inflate; 
var text = inflate(zipped, {to: 'string'});

7
कृपया gzipped स्ट्रिंग्स को डिकोड करने के लिए क्लाइंट-साइड उदाहरण प्रदान करें।
रेडसेंड्रो

2
var inflate = require('pako/lib/inflate').inflate; var text = inflate(zipped, {to: 'string'});@ रोदसन्द्रो यहाँ है कि मैं कैसे पाको का उपयोग करता हूँ।
फॉरेस्टो

वह incorrect header check
क्लाइंटसाइड

17

मैंने स्टैंडअलोन जावास्क्रिप्ट में एक GWT मॉड्यूल से LZMA के कार्यान्वयन को चित्रित किया। इसे LZMA-JS कहा जाता है ।


1
क्या आपके पास इसके लिए एक संगत php मॉड्यूल है?
सिरबर

यूआरएल 404 है, और मैं नहीं पर इसे पा सकते हैं कि github.com/nmrugg या तो
hanshenrik

क्षमा करें, लिंक बदल गया। यहाँ नया है: lzma-js.github.io/LZMA-JS

14

यहाँ जावास्क्रिप्ट में लागू कुछ अन्य संपीड़न एल्गोरिदम हैं:


इस LZMA कार्यान्वयन के लिए BrowserPlus (एक ब्राउज़र एक्सटेंशन) की आवश्यकता होती है और यह शुद्ध जावास्क्रिप्ट नहीं दिखता है
Piotr Findeisen

यह LZ77 कार्यान्वयन अब उपलब्ध नहीं है और कम से कम यह पायथन संस्करण (एक ही पृष्ठ पर प्रकाशित) काफी सरल आदानों के लिए गलत था।
13

भू-मृतक, लिंक को अपडेट करेगा
मौरिसियो शेफ़र

यह मैं क्या चाहता हूँ के करीब है। googling चीजें यहां भी अपडेट होंगी
Theofanis Pantelides

8

मैंने परीक्षण नहीं किया, लेकिन जेएसजिप नामक जिप की एक जावास्क्रिप्ट है:

http://jszip.stuartk.co.uk/

https://stuk.github.io/jszip/


1
यह ज़िप है, गज़िप नहीं है, और यह हुड के नीचे पाको का उपयोग करता है। अंतर यह है कि ज़िप में फ़ाइल जानकारी मेटाडेटा है।
विटाली

0

मुझे लगता है कि जेनेरिक क्लाइंट-साइड जावास्क्रिप्ट कम्प्रेशन इम्प्लीमेंटेशन प्रोसेसिंग टाइम के संदर्भ में एक बहुत महंगा ऑपरेशन होगा क्योंकि कुछ अधिक HTTP पैकेटों के असम्पीडित पेलोड के समय ट्रांसफर करने का विरोध किया गया था।

क्या आपने कोई परीक्षण किया है जिससे आपको अंदाजा होगा कि बचत करने में कितना समय है? मेरा मतलब है, बैंडविड्थ बचत वह नहीं हो सकती जो आप कर रहे हैं, या यह हो सकता है?


मुझे कुल डेटा आकार को एक निश्चित कोटा के भीतर रखने की आवश्यकता है - आकार समय की तुलना में अधिक महत्वपूर्ण है।
डेविड सिट्रोन

हम्म ... सीमा क्यों है? बस उत्सुक।
तोमलक

ठीक है, यहाँ पर Google की इस पर बात है: code.google.com/apis/opensocial/articles/… - ठेठ ओपेंस्सियल कोटा लगभग 10K हैं।
डेविड सिट्रोन

मैं देखता हूं, स्पष्टीकरण के लिए धन्यवाद।
तोमलक

1
संपीड़न कितना गहन है, इसके आधार पर, आप पर्दे के पीछे कार्य करने के लिए वेब कर्मचारियों का उपयोग कर सकते हैं।
14

-3

अधिकांश ब्राउज़र मक्खी पर गज़िप को विघटित कर सकते हैं। यह एक जावास्क्रिप्ट कार्यान्वयन से बेहतर विकल्प हो सकता है।


20
हां, लेकिन मुझे इसे भेजने से पहले क्लाइंट की तरफ से डेटा को कंप्रेस करना होगा ...
डेविड सिट्रन

-4

आप पृष्ठ में एम्बेडेड 1 पिक्सेल जावा एप्लेट प्रति 1 पिक्सेल का उपयोग कर सकते हैं और संपीड़न के लिए उपयोग कर सकते हैं।

यह जावास्क्रिप्ट नहीं है और क्लाइंट को जावा रनटाइम की आवश्यकता होगी लेकिन यह वही करेगा जो आपको चाहिए।


7
दिलचस्प है, लेकिन यदि संभव हो तो मैं एप्लेट को शामिल करने से बचना चाहता हूं।
डेविड सिट्रोन

मैं वास्तविक उपयोग के मामलों को जोड़ना चाहता हूं
cm

1
एक अच्छा समाधान नहीं है क्योंकि यह जावा पर निर्भरता जोड़ता है। इसके अलावा, हर किसी ने जावा स्थापित करने के लिए परेशान नहीं किया है - साइट कुछ लोगों के लिए काम नहीं करेगी। व्यक्तिगत रूप से मैंने जावा को स्थापित किया है क्योंकि मुझे कुछ समय पहले इसकी आवश्यकता थी, लेकिन मैं उन साइटों पर जाना पसंद करता हूं जो जावा का उपयोग नहीं करते हैं।
ऑनकेलबर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.