当前位置: 首页 > 知识库问答 >
问题:

JavaScript Zlib解压缩

公良莫希
2023-03-14
$raw = file_get_contents("file_here");
$uncompressed = zlib_decode($raw);
    null

在最近的更新中,解压库工作,但解包不工作。请跳到底部9月16日的更新。

我已经尝试了几个JavaScript库,但仍然无法使其工作:

Pako:https://github.com/nodeca/pako

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);
});
    null

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);
});

错误:未捕获错误:不支持的压缩方法flate.js:60

仍然使用Imaya的zlib,结合这个堆栈溢出问题:解压缩javascript中的gzip和zlib字符串

$.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);
});
console.log(RawDeflate.inflate(response));

输出:

奥古斯特尔的JS-Abultate:https://github.com/augustl/js-Abultate

console.log(JSInflate.inflate(response));

输出:

问题似乎出在JavaScriptunpack()函数上。当我使用PHP生成的字节数组:http://pastebin.com/udwvk94b时,JavaScript解压缩函数会起作用。

工作的PHP解包:

$unpacked = unpack("C*", $raw);

关于我使用的JavaScriptunpack()代码,它不起作用,请参见Pako下的文章顶部部分。

所以新的问题是,为什么JavaScript生成的字节数组值不同于PHP生成的字节数组值。

  • 这真的是unpack()函数的问题吗?
  • 还是当JS获取文件时,编码或任何更改导致字节混乱?
  • 最后,您建议的修复方法是什么?

随着更多的研究和一些答案在这里提供了线索

  • Sebastian提出问题在于检索数据的方式,与文本编码有关
  • User3995789提供了一个示例,说明即使没有unpack()函数也可以工作,尽管它不在Chrome Extensions
  • 的上下文中
  • Isaac提供了Chrome扩展上下文中的示例,但仍然不起作用

在此基础上,我进一步研究了所有线索,这些线索使我得出一个理论,即这一切背后的原因是Chrome无法通过其request.getContent函数获取“原始”数据。有关上述功能的Chrome文档请参见此处。

到目前为止,我已经把这个问题带到了Chrome,请看这里。

虽然问题没有完全解决,但我认为对我最有用的答案是@Sebastian S的,他认为我接收或接收数据的“方式”有问题,错误的转换是原因,这与问题差不多。

共有1个答案

荣德厚
2023-03-14

Jquery以UTF8格式读取,您必须读取原始文件,此函数才能工作。

function readTextFile(file)
{
    var rawFile = new XMLHttpRequest();
    rawFile.open('GET', file, true);  
    rawFile.responseType = 'arraybuffer';
    rawFile.onload = function (response)
    {
      var words = new Uint8Array(rawFile.response);
       console.log(words[1]);
      console.log(pako.ungzip(words));

    };
    rawFile.send();
}

有关更多信息,请参见此答案。

 类似资料:
  • tar [-]c|x|u|r|t[z|j][v] -f 归档文件 [待打包文件] 将多个文件打包为一个归档文件,可以在打包的同时进行压缩。支持的格式为 tar(归档)、gz(压缩)、bz2(压缩率更高,比较耗时) 操作选项 -c 创建 -x 解包 -u 更新 -r 添加 -t 查看 -d 比较压缩包内文件和文件 -A 将 tar 文件添加到归档文件中 格式选项 -z 使用 gz 压缩格式 -j 使

  • 主要内容:1. 压缩和解压缩介绍,2. 启用压缩,3. 启用解压缩,4. 发送压缩文件本节介绍如何配置响应的压缩或解压缩以及发送压缩文件。 在这篇文章中,涉及内容如下 - 压缩和解压缩介绍 启用压缩 启用解压缩 发送压缩文件 1. 压缩和解压缩介绍 压缩响应通常会显着减少传输数据的大小。 然而,由于压缩在运行时发生,它还可以增加相当大的处理开销,这会对性能产生负面影响 在向客户端发送响应之前,NGINX会执行压缩,但不会“压缩”已压缩的响应(例如,由代理的服务器)。 2. 启用压缩

  • 本文向大家介绍Linux下压缩与解压命令详解,包括了Linux下压缩与解压命令详解的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了Linux下压缩与解压缩命令,供大家参考,具体内容如下 【tar命令】 解压:tar -zxvf FileName.tar 压缩:tar -czvf FileName.tar DirName 【gz命令】 解压1:gunzip FileName.gz 解压2:

  • 本文向大家介绍ZIP4j 压缩与解压的实例详解,包括了ZIP4j 压缩与解压的实例详解的使用技巧和注意事项,需要的朋友参考一下 ZIP4j 压缩与解压的实例详解 使用的jar包:zip4j_1.3.2.jar 基本功能: 针对ZIP压缩文件创建、添加、分卷、更新和移除文件 (读写有密码保护的Zip文件) (支持AES 128/256算法加密) (支持标准Zip算法加密) (支持zip64格式) (

  • 问题内容: 我知道这是一项容易的任务,但是更改代码后它停止工作,并且无法恢复!我实际上使用了两个函数来进行压缩和解压缩,尽管实际上它是“ jar”和“ unjar”,但这并没有太大的区别 任何帮助/建议吗? 创建JarFile时发生错误: 问题答案: 我不知道这是否是您的问题,但是通常最好在完成写入后关闭每个zip条目。 请参阅。 在显示的代码中,不会关闭邮政编码中的最后一个条目。您也不会显示关闭

  • 前面小节介绍了如何对文件和目录删除、移动操作,本小节介绍如何使用命令对文件和目录进行压缩与解压操作,常见的压缩包格式有 .bz2、.Z、.gz、.zip、.xz,压缩之后的文件或目录占用更少的空间。 1. tar 命令介绍 下面列举 tar 命令的参数: tar 命令参数名称 功能与作用描述 -c 新建立压缩档案 -x 解压缩 -t 查看内容 -u 更新原压缩包的内容 -z gzip 属性的 -j

  • Demo示例了如何利用第三方类库 ZipArchive 来解压和压缩.zip文件。Demo的演示过程是:先从网络下载一个.zip文件,然后解压它,最后再进行压缩。 代码的解释文章(英文)是:http://www.icodeblog.com/2012/08/13/unzipping-files-using-zip-archive/ [Code4App.com]

  • 解析redis的lzf压缩和解压算法