Декомпрессия ZLIB - сторона клиента
Я получаю данные как сжатый входной поток 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
Ответы
Ответ 1
Pako - это полный и современный порт Zlib
.
Вот очень простой пример, и вы можете работать оттуда.
Получите 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 перед тем, как отправить его, поскольку массив отправляет много накладных расходов при отправке в виде 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.
Ответ 2
Более недавнее предложение https://github.com/imaya/zlib.js
Я думаю, что это намного лучше, чем альтернативы.
Ответ 3
Наша библиотека JSXGraph содержит алгоритм дефляции, распаковки и gunzip. Пожалуйста, посмотрите на jsxcompressor (выделение из JSXGraph, см. http://jsxgraph.uni-bayreuth.de/wp/download/) или в Utils.js в исходном коде.
Ответ 4
Так же, как предлагают первые комментарии к вашему вопросу, я подозреваю, что вы действительно хотите, чтобы браузер обрабатывал декомпрессию. Если я ошибаюсь, вы можете проверить библиотеку JSXGraph, она должна содержать чистую JS-реализации для дефляции и распаковки.
Ответ 5
Проект js-deflate dankogai может быть тем, что вы ищете. Я на самом деле не пробовал, но код rawinflate.js кажется довольно минимальным и должен иметь возможность распаковывать данные DEFLATE/zlib: ed.
Ответ 6
Попробуйте pako https://github.com/nodeca/pako, это не просто раздувает/дефлировать, а точно порт zlib для javascript, причем почти все функции и опции поддерживаются. Кроме того, это самая быстрая реализация в современных браузерах.
Ответ 7
вы должны увидеть 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;
}
Очень важно, что в Java-дефлекторе вы должны вырезать головной 2-байтовый, 4-й байт, чтобы получить исходный спуск.