Javascript ZLIB解压-客户端
我以“ZLIB”压缩输入流的形式接收数据 使用Javascript/Ajax/JQuery,我需要在客户端解压它 有没有办法做到这一点?请帮忙 我已经在JAVA中完成了这项工作,如下所示,但需要在客户端完成这项工作Javascript ZLIB解压-客户端,javascript,zlib,compression,Javascript,Zlib,Compression,我以“ZLIB”压缩输入流的形式接收数据 使用Javascript/Ajax/JQuery,我需要在客户端解压它 有没有办法做到这一点?请帮忙 我已经在JAVA中完成了这项工作,如下所示,但需要在客户端完成这项工作 url = new URL(getCodeBase(), dataSrcfile); URLConnection urlConn = url.openConnection(); urlConn.setUseCaches(false); InputStream in = urlCo
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
正如对您的问题的第一个评论所暗示的,我怀疑您实际上希望浏览器处理解压缩。如果我弄错了,您可能想查看库,它应该包含pure。我们的库JSXGraph包含deflate、unzip和gunzip算法。请看一下源代码中的jsxcompressor(JSXGraph的衍生产品,请参阅)或Utils.js 您应该从以下位置查看zlib rfc: 我测试的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中,非常重要的一点是在deflate中,您必须将head 2字节、foot 4字节切掉,以获得原始deflate。dankogai的项目可能就是您正在寻找的。实际上我还没有试过,但是rawinflate.js代码似乎非常小,应该能够解压缩DEFLATE/zlib:ed数据。最近的一个产品是 我认为它比其他选择好得多。试试pako,它不仅仅是充气/放气,而且是javascript的精确zlib端口,几乎支持所有功能和选项。而且,它是现代浏览器中最快的实现。是一个完整的、现代的
Zlib
端口
这是一个非常简单的示例,您可以从这里开始工作
获取并可以通过tearray进行解压缩,如下所示:
<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>
运行示例:
更高级的是,.非常适合我,它使用pako,并且具有与zlib完全相同的api。在使用pako在客户端压缩/解压zlib编码的有效负载的过程中,我挣扎了好几天,我可以说browserify zlib真的很方便。为什么?只要使用HTTP压缩,浏览器就会透明地处理它。如果服务器端已经存在并且无法更改,该怎么办?我同意最好在HTTP级别进行压缩。但是你并不总是有选择的余地。你试过把zlib C代码编译成javascript吗?看起来Emscripten可以做到这一点。这能回答你的问题吗?谢谢你的回复,但我有点困惑。我检查了JSXGraph,但它看起来像一个用于绘制圆弧、圆等形状的库。您是否有一个纯HTML和JavaScript(无PHP)示例,其中使用Zlib压缩的文件(输入sream)可以被取消压缩。请帮助我,我宁愿使用带有英文文档的图书馆,这本书有一些亚洲语言的自述文件,在我看来是日文或中文的。我不明白这有什么关系。如果您熟悉zlib,那么API是清晰的。这个库设计得很好,速度很快,也很容易使用。通过点击标记的链接可以获得英文文档。我对Pako.js的体验比imaya/zlib.jsupported要好。您能否提供一个客户端示例(包括需要哪些文件)?所有文档都是关于使用(服务器端)
node.js
。这里有一个浏览器示例:感谢您对我的工作示例被否决的原因提出的建设性意见。要从未压缩的数据中获取字符串,您还可以执行以下操作:var strData=pako.inflate(binData,{To:'string})代码>。请参阅此处的选项:我收到“不正确的标题检查”错误
// 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);