【问题标题】:ZLIB Decompression - Client SideZLIB 解压 - 客户端
【发布时间】:2011-05-29 06:48:39
【问题描述】:

我正在以“ZLIB”压缩输入流的形式接收数据。

使用 Javascript/Ajax/JQuery,我需要在客户端解压缩。

有办法吗?

我已经在 J​​AVA 中进行了如下操作,但需要在客户端执行此操作。

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

【问题讨论】:

  • 为什么?只需使用 HTTP 压缩,浏览器就会透明地处理。
  • 如果服务器端已经存在并且无法更改怎么办?我同意在 HTTP 级别进行压缩会更好。但你并不总是有选择的余地。
  • 您是否尝试将 zlib C 代码编译为 javascript? Emscripten 似乎可以做到这一点。
  • 这能回答你的问题吗? Decompress gzip and zlib string in javascript

标签: javascript zlib compression


【解决方案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 documentation

【讨论】:

  • 感谢您对为什么我的工作示例被否决的建设性评论。
  • 要从未压缩的数据中获取字符串,您也可以这样做:var strData = pako.inflate(binData, { to: 'string' });。在此处查看选项:nodeca.github.io/pako/#inflate
【解决方案2】:

最近的产品是https://github.com/imaya/zlib.js

我认为它比替代品要好得多。

【讨论】:

  • 我宁愿使用带有英文文档的库,这个有一些亚洲语言的自述文件,对我来说看起来是日语或中文。
  • 我看不出这有多重要。如果您熟悉 zlib,API 就很清楚了。该库设计精良、速度快且易于使用。
  • 英文文档可通过单击标记为English Documentation的链接获得。
  • 我对 Pako.js 的体验比 imaya/zlib.js 更好
【解决方案3】:

我们的 JSXGraph 库包含 deflate、unzip 和 gunzip 算法。请查看 jsxcompressor(JSXGraph 的衍生产品,参见http://jsxgraph.uni-bayreuth.de/wp/download/)或源代码中的 Utils.js。

【讨论】:

    【解决方案4】:

    试试 pako https://github.com/nodeca/pako ,它不仅仅是充气/放气,而是精确的 zlib 到 javascript 的端口,几乎支持所有功能和选项。此外,它是现代浏览器中最快的实现。

    【讨论】:

    【解决方案5】:

    正如您问题的第一个 cmets 所建议的那样,我怀疑您实际上希望浏览器处理解压缩。如果我弄错了,您可能想查看JSXGraph 库,它应该包含纯JS implementations for deflate and unzip

    【讨论】:

    • 感谢您的回复,但我有点困惑。我检查了 JSXGraph,但它看起来像是一个用于绘制 Arc、Circle 等形状的库。请提供一个纯 HTML 和 JavaScript(无 PHP)示例,其中可以解压缩使用 Zlib 压缩的文件(输入 sream)。请帮忙
    【解决方案6】:

    dankogai 的js-deflate 项目可能就是您要找的。我还没有真正尝试过,但 rawinflate.js 代码似乎相当少,应该能够解压缩 DEFLATE/zlib:ed 数据。

    【讨论】:

      【解决方案7】:

      Browserify-zlib 非常适合我,它使用 pako 并具有与 zlib 完全相同的 api。在我用 pako 在客户端压缩/解压缩 zlib 编码的有效负载几天后,我可以说 browserify-zlib 真的很方便。

      【讨论】:

        【解决方案8】:

        使用 Pako,您可以解码压缩的 (gzib) 响应,上面的短代码 answer

        JSON.parse(Pako.inflate(Buffer.from(data, 'base64'), { to: 'string' }))
        

        Buffer.from, Pako

        【讨论】:

          【解决方案9】:

          你应该看到zlib rfc

          我测试的javascript膨胀代码:inflate in 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 中,您必须将头 2 字节、脚 4 字节剪掉,才能得到原始的 deflate。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多