【发布时间】:2014-10-30 03:34:08
【问题描述】:
我正在尝试解压缩 zlib'ed XML,如下所示: https://drive.google.com/file/d/0B52P0MZLTdw8ZzQwQzVpZGZVZWc
上传到在线解压服务作品,如:http://i-tools.org/gzip
在 PHP 中,我正在使用这段代码并且工作得很好,我得到了 XML 字符串:
$raw = file_get_contents("file_here");
$uncompressed = zlib_decode($raw);
但是,我想在 JavaScript 中执行此操作。
- 该应用是一个客户端 Chrome 扩展程序,它使用从网络日志中读取的chrome.devtools.network
- 读取二进制响应。顶部的 Google 云端硬盘链接示例
- JS 需要将该响应解压为原始 XML,然后解析为对象
我唯一的问题是 zlib 解压缩部分。
从最新更新开始,解压库可以工作,但解压却不能。请跳至底部的 9 月 16 日更新。
我已经尝试了几个 JavaScript 库,但仍然无法正常工作:
帕科:https://github.com/nodeca/pako
unpack() 代码:https://codereview.stackexchange.com/questions/3569/pack-and-unpack-bytes-to-strings
function unpack(str) {
var bytes = [];
for(var i = 0, n = str.length; i < n; i++) {
var char = str.charCodeAt(i);
bytes.push(char >>> 8, char & 0xFF);
}
return bytes;
}
$.get("file_here", function(response){
var charData = unpack(response);
var binData = new Uint8Array(charData);
var data = pako.inflate(binData);
var strData = String.fromCharCode.apply(null, new Uint16Array(data));
console.log(strData);
});
错误:Uncaught incorrect header check
即使将响应放在其他地方也是一样的:
new Uint8Array(response);pako.inflate(response);
Imaya 的 zlib:https://github.com/imaya/zlib.js
$.get("file_here", function(response){
var inflate = new Zlib.Inflate(response);
var output = inflate.decompress();
console.log(output);
});
错误:Uncaught Error: unsupported compression methodinflate.js:60
仍然使用 Imaya 的 zlib,结合这个 Stack Overflow 问题: Decompress gzip and zlib string in javascript
$.get("file_here", function(response){
var response = response.split('').map(function(e) {
return e.charCodeAt(0);
});
var inflate = new Zlib.Inflate(response);
var output = inflate.decompress();
console.log(output);
});
错误:Uncaught Error: invalid fcheck flag:29inflate.js:65
dankogai 的 js-deflate:https://github.com/dankogai/js-deflate
console.log(RawDeflate.inflate(response));
输出: 空
augustl 的 js-inflate:https://github.com/augustl/js-inflate
console.log(JSInflate.inflate(response));
输出: 空
zlib-browserify:https://github.com/brianloveswords/zlib-browserify
错误:ReferenceError: exports is not defined
这只是 Imaya 的 zlib 的包装器。我想这是requireJS?我什至不确定如何使用它。它甚至可以在不安装任何东西而只安装 jQuery/JS 的情况下使用吗?上面提到的应用程序是可下载的 Chrome 扩展程序,只有 HTML 导入 JS 文件。
2014 年 9 月 16 日更新
看来问题出在 JavaScript unpack( ) 函数上。当我使用 PHP 生成的 ByteArray:http://pastebin.com/uDWvK94B 时,JavaScript 解压函数起作用。
有效的 PHP 解包:
$unpacked = unpack("C*", $raw);
对于我使用的 JavaScript unpack( ) 代码,它不起作用,请参阅 Pako 部分下的帖子顶部。
所以新的问题是,为什么 JavaScript 生成的 ByteArray 值与 PHP 生成的不同。
- 真的是
unpack( )函数有问题吗? - 还是当 JS 获取文件、编码或任何更改导致字节混乱时?
- 最后,您建议的解决方法是什么?
2014 年 9 月 20 日更新
随着更多的研究和这里的一些答案给出线索
- Sebastian S 提出问题出在检索数据的方式上,并且与文本编码有关
-
user3995789 提供了一个示例,即使在没有
unpack( )函数的情况下,它也可以工作,尽管在 Chrome 扩展程序的上下文之外 - Isaac 在 Chrome 扩展程序的上下文中提供示例,但仍然不起作用
我研究了进一步结合所有线索,这使我得出一个理论,即这一切背后的原因是 Chrome 无法通过其request.getContent 函数获取“原始”数据。 See here 用于上述功能的 Chrome 文档。
到目前为止,我已将问题提交给 Chrome,see here。
2015 年 3 月 24 日更新
虽然问题没有完全解决,但我认为对我最有用的答案来自@Sebastian S,他提出我获取或接收数据的“方式”有问题,转换错误是原因,与问题所在的位置一样接近。
【问题讨论】:
-
你在用 chrome devtools 的扩展吗?
-
是的,我在使用
chrome.devtools.network.onRequestFinished的开发工具上,稍后将执行request.getContent(function(response){,其中response是我需要解压缩的工具
标签: javascript jquery google-chrome-extension bytearray zlib