Javascript ZLIB解压-客户端

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

我以“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

正如对您的问题的第一个评论所暗示的,我怀疑您实际上希望浏览器处理解压缩。如果我弄错了,您可能想查看库,它应该包含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);