「[〜#〜] 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
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/
または、JSONまたはXMLとして送信するときに配列が多くのオーバーヘッドを消費するため、送信する前に配列をbase64エンコードすることができます。同様にデコードします:
// 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ドキュメント があります。
最近のオファリングは https://github.com/imaya/zlib.js
私はそれが代替案よりもはるかに優れていると思います。
私たちのライブラリJSXGraphには、deflate、unzip、gunzipアルゴリズムが含まれています。 jsxcompressor(JSXGraphからのスピンオフ、 http://jsxgraph.uni-bayreuth.de/wp/download/ を参照)またはソースコードのUtils.jsをご覧ください。
あなたの質問に対する最初のコメントが示唆しているように、私はあなたが実際にブラウザに解凍を処理させたいのではないかと思います。私が間違っている場合は、 JSXGraph ライブラリをチェックすることをお勧めします。これには純粋な deflateおよびunzip用のJS実装 が含まれているはずです。
js-deflate dankogaiによるプロジェクトはあなたが探しているものかもしれません。私は実際にそれを試していませんが、rawinflate.jsコードはかなり最小限のようであり、DEFLATE/zlib:edデータを解凍できるはずです。
Pako https://github.com/nodeca/pako を試してください。これは、単に膨張/収縮するだけでなく、javascriptへの正確なzlibポートであり、ほとんどすべての機能とオプションがサポートされています。また、これは最新のブラウザで最速の実装です。
次の場所からzlibrfcが表示されます。 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バイトカットする必要があります。
Browserify-zlib 私にとっては完璧に機能し、pakoを使用し、zlibとまったく同じAPIを備えています。クライアント側でpakoを使用してzlibでエンコードされたペイロードを圧縮/解凍するのに何日も苦労した後、browserify-zlibは本当に便利だと言えます。