Декомпрессия ZLIB - на стороне клиента - PullRequest
14 голосов
/ 22 декабря 2010

Я получаю данные в виде сжатого входного потока " ZLIB ".

Используя Javascript / Ajax / JQuery, мне нужно распаковать его на стороне клиента.

Есть ли способ сделать это?Пожалуйста, помогите.

У меня уже есть эта работа в JAVA, как показано ниже, но я должен сделать это на стороне клиента.

url = new URL(getCodeBase(), dataSrcfile); 
URLConnection urlConn = url.openConnection();
urlConn.setUseCaches(false); 
InputStream in = urlConn.getInputStream();
InflaterInputStream inflate = new InflaterInputStream(in);
InputStreamReader inputStreamReader = new InputStreamReader(inflate);
InputStreamReader inputStreamReader = new InputStreamReader(in);
BufferedReader bufReader = new BufferedReader(inputStreamReader);
// Read until no more '#'
int i = 0;
int nHidden = 0;
String line1;
do //------------------------Parsing Starts Here
{
    line1 = bufReader.readLine();
.............
...... so on

Ответы [ 8 ]

17 голосов
/ 27 марта 2014

Pako - это полный и современный Zlib порт.

Вот очень простой пример, и вы можете работать оттуда.

Get pako.js и вы можете распаковать byteArray следующим образом:

<html>
<head>
  <title>Gunzipping binary gzipped string</title>
  <script type="text/javascript" src="pako.js"></script>
  <script type="text/javascript">

    // Get datastream as Array, for example:
    var charData    = [31,139,8,0,0,0,0,0,0,3,5,193,219,13,0,16,16,4,192,86,214,151,102,52,33,110,35,66,108,226,60,218,55,147,164,238,24,173,19,143,241,18,85,27,58,203,57,46,29,25,198,34,163,193,247,106,179,134,15,50,167,173,148,48,0,0,0];

    // Turn number array into byte-array
    var binData     = new Uint8Array(charData);

    // Pako magic
    var data        = pako.inflate(binData);

    // Convert gunzipped byteArray back to ascii string:
    var strData     = String.fromCharCode.apply(null, new Uint16Array(data));

    // Output to console
    console.log(strData);

  </script>
</head>
<body>
    Open up the developer console.
</body>
</html>

Пример выполнения: http://jsfiddle.net/9yH7M/

В качестве альтернативы вы можете закодировать массив в base64 перед его передачей, когда Array принимаетмного накладных расходов при отправке в формате JSON или XML.Расшифруйте аналогично:

// Get some base64 encoded binary data from the server. Imagine we got this:
var b64Data     = 'H4sIAAAAAAAAAwXB2w0AEBAEwFbWl2Y0IW4jQmziPNo3k6TuGK0Tj/ESVRs6yzkuHRnGIqPB92qzhg8yp62UMAAAAA==';

// Decode base64 (convert ascii to binary)
var strData     = atob(b64Data);

// Convert binary string to character-number array
var charData    = strData.split('').map(function(x){return x.charCodeAt(0);});

// Turn number array into byte-array
var binData     = new Uint8Array(charData);

// Pako magic
var data        = pako.inflate(binData);

// Convert gunzipped byteArray back to ascii string:
var strData     = String.fromCharCode.apply(null, new Uint16Array(data));

// Output to console
console.log(strData);

Рабочий пример: http://jsfiddle.net/9yH7M/1/

Чтобы продвинуться дальше, вот документация pako API .

11 голосов
/ 15 сентября 2012

Более свежее предложение - https://github.com/imaya/zlib.js

Я думаю, что оно намного лучше, чем альтернативы.

3 голосов
/ 09 марта 2011

Наша библиотека JSXGraph содержит алгоритмы deflate, unzip и gunzip.Пожалуйста, посмотрите на jsxcompressor (выход из JSXGraph, см. http://jsxgraph.uni -bayreuth.de / wp / download / ) или Utils.js в исходном коде

2 голосов
/ 22 декабря 2010

Так же, как и в первых комментариях к вашему вопросу, я подозреваю, что вы действительно хотите, чтобы браузер обрабатывал декомпрессию. Если я ошибаюсь, вы можете проверить библиотеку JSXGraph , которая должна содержать чистые реализации JS для deflate и unzip .

1 голос
/ 15 марта 2014

Попробуйте pako https://github.com/nodeca/pako, это не просто раздувание / раздувание, а точный порт zlib в javascript, с поддержкой почти всех функций и опций. Кроме того, это самая быстрая реализация в современных браузерах.

1 голос
/ 26 апреля 2011

Проект js-deflate от dankogai может быть тем, что вы ищете. Я на самом деле не пробовал, но код rawinflate.js кажется довольно минимальным и должен быть в состоянии распаковать данные DEFLATE / zlib: ed.

0 голосов
/ 15 мая 2018

Browserify-zlib отлично работает для меня, использует pako и имеет те же API, что и zlib. После того, как я несколько дней боролся со сжатием / распаковкой zlib-кодированных полезных нагрузок на стороне клиента с помощью pako, я могу сказать, что browserify-zlib действительно удобен.

0 голосов
/ 18 апреля 2011

вы должны увидеть zlib rfc из: zlib rfc

javascript-код для раздувания, который я тестировал: для раздувания в Javascript код Java, который я написал:

    static public byte[] compress(byte[] input) {
    Deflater deflater = new Deflater();
    deflater.setInput(input, 0, input.length);
    deflater.finish();
    byte[] buff = new byte[input.length + 50];
    deflater.deflate(buff);

    int compressedSize = deflater.getTotalOut();

    if (deflater.getTotalIn() != input.length)
        return null;

    byte[] output = new byte[compressedSize - 6];

    System.arraycopy(buff, 2, output, 0, compressedSize - 6);// del head and
                                                                // foot byte
    return output;
}

Очень важно, что в deflate в Java вы должны отрезать голову 2 байта, фут 4 байта, чтобы получить сырой дефлат.

...