জাজিপ জাভাস্ক্রিপ্ট বাস্তবায়ন [বন্ধ]


208

আমি এমন একটি ওয়েব অ্যাপ্লিকেশন লিখছি যা এজেনার মাধ্যমে একটি ছোট, স্থির আকারের সার্ভার-সাইড ক্যাশে JSON ডেটা সংরক্ষণ করতে হবে (মনে করুন: Opensocial quotes )। আমার সার্ভারের নিয়ন্ত্রণ নেই।

সার্ভার-সাইড কোটার মধ্যে থাকতে আমার সঞ্চিত ডেটার আকার হ্রাস করতে হবে এবং এটি সার্ভারে প্রেরণের আগে ব্রাউজারে স্ট্রিংফাইড জেএসওন জিজপ করতে সক্ষম হবেন বলে আশা করছিলাম।

তবে, জিজিপ জাভাস্ক্রিপ্ট বাস্তবায়নের পথে আমি খুব বেশি কিছু পাই না। আমি কীভাবে ক্লায়েন্ট পক্ষের ডেটা প্রেরণের আগে সংকুচিত করতে পারি তার জন্য কোনও পরামর্শ?


6
আপনি এটা পাঠাচ্ছেন আপ সার্ভারে। এজন্য "আপলোড" এবং "ডাউনলোড" এর ধারণা রয়েছে। সম্ভবত সে কারণেই আপনি এমন উত্তর পেয়ে যাচ্ছেন যা আপনাকে "সার্ভার এটি করতে পারে" বলে।
তোমালাক

3
জাভাস্ক্রিপ্ট একক থ্রেডযুক্ত, কারণ এটির যথাযথ বাস্তবায়ন সম্ভবত জটিল। এটি সম্ভবত সেটটাইমআউট () ব্যবহার করে ব্যাচগুলিতে সঙ্কুচিত হতে হবে, যাতে সংকোচনের সময় ইউআই লকআপ না করে।
আগস্ট লিলিয়াস

সম্ভবত আপনি নিজের সংক্ষেপণ অ্যালগরিদম লিখতে পারেন
ক্যাপ্টেন কুর

3
@ অগাস্টলিলিয়াস এখন আপনি এটি করতে ওয়েবকর্মীদের ব্যবহার করতে পারেন :)
ক্যাপ্টেন স্পষ্টত

উত্তর:


138

সম্পাদনাটি আরও ভাল এলজেডব্লিউ সমাধান হতে পারে যা ইউনিকোড স্ট্রিংগুলি http://pieroxy.net/blog/pages/lz-string/index.html এ সঠিকভাবে পরিচালনা করে ।


আমি কোনও জিজিপ বাস্তবায়ন জানি না, তবে জসোলেট লাইব্রেরিতে (সাইটটি চলে গেছে বলে মনে হচ্ছে) এলজেডব্লিউ সংক্ষেপণ / ডিকম্প্রেশনগুলির জন্য ফাংশন রয়েছে। কোডটি এলজিপিএলের আওতায় এসেছে ।

// 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
এলজেডব্লিউটি এখনও পেটেন্ট হওয়ার পক্ষে অনেক পুরানো। সর্বশেষ পেটেন্টগুলি 2003 বা তার মধ্যে শেষ হয়েছিল। নিখরচায় বাস্তবায়ন প্রচুর পরিমাণে রয়েছে।
ypnos

5
আমি উপরের কোডটিতে কমপক্ষে দুটি সমস্যা দেখতে পাচ্ছি: 1) "এই সংকোচনের জন্য পরীক্ষা করুন \ u0110 \ u0111 \ u0112 \ u0113 \ u0114 অ্যাসিআই অক্ষর।", 2) কোড> 65535
some

5
এখানে 21 টি বিভিন্ন ভাষায় বাস্তবায়ন রয়েছে rosettacode.org/wiki/LZW_compression এটা লেখা আছে যে এটি 2004 সালে পাবলিক ডোমেনে আছে
jcubic

5
@ কিছুক্ষণ আমি এখানে একটি সমস্যা দেখিয়েছি ঠিক ঠিক এখানে সমস্যাগুলি সংশোধন করে: pieroxy.net/blog/pages/lz-string/index.html
পিয়েরোক্সি

53

আমার আর একটি সমস্যা ছিল, আমি জিজিপ-তে ডেটা এনকোড করতে চাইনি তবে জিপিড ডেটা ডিকোড করতে চাইছি । আমি ব্রাউজারের বাইরে জাভাস্ক্রিপ্ট কোড চালাচ্ছি তাই খাঁটি জাভাস্ক্রিপ্ট ব্যবহার করে এটি ডিকোড করা দরকার ।

এটি আমার কিছুটা সময় নিয়েছে তবে আমি দেখতে পেয়েছি যে জেএসএক্সগ্রাফ লাইব্রেরিতে জিজেপড ডেটা পড়ার উপায় রয়েছে।

এখানে আমি কোথায় গ্রন্থাগার পাওয়া যায়নি: http://jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/ এমনকি একটি স্বতন্ত্র ইউটিলিটি তা করতে পারে যে, JSXCompressor , এবং কোডটি এলজিপিএল লাইসেন্সপ্রাপ্ত।

আপনার প্রকল্পে কেবল jsxcompressor.js ফাইল অন্তর্ভুক্ত করুন এবং তারপরে আপনি একটি বেস 64 এনকোডেড জিজেপড ডেটা পড়তে সক্ষম হবেন:

<!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
আমি অবাক হই যে যখন ইউএনকম্প্রেসার হয় তখন পৃথিবীতে কেন এটিকে "সংক্ষেপক" বলা হয়। lol
মাত্তেও

1
প্রায় 5 বছর পরে, এখনও দরকারী। ধন্যবাদ. আমি একটি বড় জেএসনকে সরাসরি পৃষ্ঠায় ডেকে দিচ্ছি, এটি এজেএক্স'র পরিবর্তে। এটি পিএইচপি দিয়ে প্রাক-সংকুচিত করে এবং এটি পুনরায় জাভাস্ক্রিপ্টের ক্লায়েন্ট সাইডে সংক্ষেপণ করে - আমি ওভারহেডের কিছু সঞ্চয় করছি।

আমাদের কি কিছু দরকার <?php..? .. আমি জিজ্ঞাসা করছি কারণ এটি পদ্ধতিতে পাস হয়েছে decompress
Jus12

আমি 14:16:28.512 TypeError: e.replace is not a function[Weitere Informationen] jsxcompressor.min.js:19:12201
পেয়েছি

40

আমরা সবেমাত্র পাকো https://github.com/nodeca/pako , জাভাস্ক্রিপ্টে জ্লিবের বন্দর প্রকাশ করেছি । আমি মনে করি এটি এখন ডিফ্লেট / ইনফ্লেট / জিজিপ / ইউএনজিপি সবচেয়ে দ্রুত জেএস বাস্তবায়ন। এছাড়াও এর গণতান্ত্রিক এমআইটি লাইসেন্স রয়েছে has পাকো সমস্ত জেলিব বিকল্পগুলি সমর্থন করে এবং এর ফলাফলগুলি বাইনারি সমান।

উদাহরণ:

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

7
জিজেপড স্ট্রিংগুলি ডিকোড করার জন্য দয়া করে ক্লায়েন্টের পাশের উদাহরণ সরবরাহ করুন।
রেডসান্দ্রো

2
var inflate = require('pako/lib/inflate').inflate; var text = inflate(zipped, {to: 'string'});@ রেডসানড্রো এখানে আমি কীভাবে পাকো ব্যবহার করব তা এখানে।
ফরেষ্টো

সেই ক্লায়েন্টের উদাহরণটি ছুঁড়েছেincorrect header check
'15

17

আমি একটি জিডব্লিউটি মডিউল থেকে এলজেডএমএর বাস্তবায়নটি স্ট্যান্ডেলোন জাভাস্ক্রিপ্টে রেখেছি। একে এলজেডএমএ-জেএস বলে


1
আপনার কি এটির জন্য উপযুক্ত পিএইচপি মডিউল আছে?
স্যারবার

সেই ইউআরএলটি 404, এবং আমি এটি github.com/nmrugg তেও খুঁজে পাচ্ছি না
hanshenrik

দুঃখিত, লিঙ্কটি পরিবর্তিত হয়েছে। এখানে নতুনটি রয়েছে

14

এখানে জাভাস্ক্রিপ্টে প্রয়োগ করা কিছু অন্যান্য সংক্ষেপণ অ্যালগরিদম রয়েছে:


এই এলজেডএমএ বাস্তবায়নের জন্য ব্রাউজারপ্লাস (একটি ব্রাউজার এক্সটেনশন) প্রয়োজন এবং খাঁটি জাভাস্ক্রিপ্ট বলে মনে হচ্ছে না
পাইট্র ফাইন্ডেন

এই LZ77 বাস্তবায়ন আর উপলভ্য নয় এবং কমপক্ষে এটি পাইথন সংস্করণ (একই পৃষ্ঠায় প্রকাশিত) বেশ সহজ ইনপুটগুলির জন্য ভুল ছিল।
পাইোটার ফাইন্ডেন

জিওসিটিগুলি মারা গেছে, লিঙ্কটি আপডেট করবে
মরিসিও শেফার

এটি আমি যা চাই তার খুব কাছাকাছি। গুগলিং জিনিসগুলিও এখানে আপডেট হবে
থিওফানিস প্যান্টালাইডস

8

আমি পরীক্ষা করিনি, তবে জিপ-এর একটি জাভাস্ক্রিপ্ট বাস্তবায়ন রয়েছে, যার নাম জেএসজিপ:

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

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


1
এটি জিপ, জিজিপ নয় এবং এটি হুডের নীচে পাকো ব্যবহার করে। পার্থক্য হ'ল জিপটিতে ফাইলের তথ্য মেটাডেটা থাকে।
ভাইটালি

0

আমি অনুমান করি যে জেনেরিক ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট সংক্ষেপণ বাস্তবায়ন প্রক্রিয়াজাতকরণের ক্ষেত্রে একটি অত্যন্ত ব্যয়বহুল ক্রিয়াকলাপ হবে যা অসম্পূর্ণ চাপের সাথে আরও কয়েকটি এইচটিটিপি প্যাকেটের স্থানান্তরের সময়গুলির বিপরীতে।

আপনি কি এমন কোনও পরীক্ষা করেছেন যা আপনাকে ধারণা দেবে যে সময় বাঁচাতে কত সময় আছে? আমি বলতে চাইছি, ব্যান্ডউইথ সঞ্চয়গুলি আপনার পরে যা হতে পারে তা হতে পারে না, বা তা পারে?


আমার মোট ডেটা আকার নির্দিষ্ট কোটার মধ্যে রাখতে হবে - সময়ের চেয়ে আকার আরও গুরুত্বপূর্ণ।
ডেভিড সিট্রন

হুঁ ... সীমা কেন? উৎসুক.
তোমালাক

ঠিক আছে, এখানে গুগল এটি গ্রহণ করেছে: কোড. google.com/apis/opensocial/articles/… - সাধারণ ওপেনসোকিয়াল কোটা প্রায় 10K এর কাছাকাছি।
ডেভিড সিট্রন

আমি স্পষ্টতার জন্য ধন্যবাদ।
তোমালাক

1
কতটা নিবিড় সংকোচনের উপর নির্ভর করে, আপনি ওয়েব কর্মীদের পর্দার পিছনে কাজটি সম্পাদন করতে ব্যবহার করতে পারেন।
zachleat

-3

বেশিরভাগ ব্রাউজারগুলি ফ্লাইতে জিজপটি সঙ্কুচিত করতে পারে। এটি জাভাস্ক্রিপ্ট প্রয়োগের চেয়ে ভাল বিকল্প হতে পারে।


20
হ্যাঁ, তবে এটি পাঠানোর আগে ক্লায়েন্টের পক্ষের ডেটা সংকোচিত করা দরকার ...
ডেভিড সিট্রন

-4

আপনি পৃষ্ঠাটিতে এম্বেড থাকা 1 পিক্সেল প্রতি 1 পিক্সেল জাভা অ্যাপলেট ব্যবহার করতে পারেন এবং এটি সংক্ষেপণের জন্য ব্যবহার করতে পারেন।

এটি জাভাস্ক্রিপ্ট নয় এবং ক্লায়েন্টদের একটি জাভা রানটাইম প্রয়োজন হবে তবে এটি আপনার যা প্রয়োজন তা করবে।


7
আকর্ষণীয়, তবে আমি যদি সম্ভব হয় তবে অ্যাপলেট অন্তর্ভুক্ত করা এড়াতে চাই।
ডেভিড সিট্রন

আমি আসল ব্যবহারের কেসগুলি যুক্ত করতে চাই
সেমিসি

1
এটি জাভাতে নির্ভরতা যুক্ত করায় কোনও ভাল সমাধান নয়। তা ছাড়া, সবাই জাভা ইনস্টল করার জন্য বিরক্ত করেনি - সাইটটি কিছু লোকের জন্য কাজ করবে না। দীর্ঘদিন আগে আমার যে কোনও প্রয়োজনের জন্য ব্যক্তিগতভাবে আমি জাভা ইনস্টল করেছি তবে আমি জাভা ব্যবহার না করে এমন সাইটগুলিতে যেতে পছন্দ করি।
ওঙ্কেলবার্গ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.