问题标签 [pako]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 从 Uint8Array 到 UTF-16 字符串的转换冻结/崩溃浏览器
我从服务器获取某种编码数据,应该正确解码并在客户端显示为字符串(UTF-16)。此刻我正在做这样的事情:
在大多数情况下,它工作正常。但有时客户端必须处理大量数据,因此它会冻结(Google Chrome 51.0.2704.84)甚至崩溃(Chromium 50.0.2661.102)浏览器选项卡。所以我发现,问题是 pako 的 inflate 方法中的 { to: 'string' } 选项,同时尝试将包含大约 50kk 个元素的 Uint8Array 转换为 UTF-16 字符串。
我试图以这样的方式手动转换它:
但它会产生:Uncaught RangeError: Maximum call stack size exceeded
所以现在我正在寻找解决方案,让事情变得更快,或者至少防止浏览器崩溃。有任何想法吗?
UPD:尝试String.fromCharCode.apply
使用块来防止异常。所以异常的问题得到了解决,但它的工作速度比第一个解决方案慢两倍。
UPD:所以问题是如何将大量 Uint8Array 转换为 UTF-16 字符串以防止浏览器冻结。
node.js - node.js ws permessagedeflate zlib 解压和pako的区别?
我有一个接收压缩数据的 node.js ws websocket。
文档中关于膨胀机制的内容非常浅薄,但通过阅读源文件,它显然是内置的,应该根据接收到的数据类型自动激活。
但是,当附加ws.on('message',function(data){})
事件时,它会返回一个< Buffer >
因为我知道这些流之前已经用 Pako 进行了膨胀,所以我尝试安装它,它实际上使用以下代码工作:
据我了解,这两个模块都使用 zlib 解压缩,但 ws 模块不知何故错过了它。
有人可以给出合理的解释或至少假设为什么吗?
javascript - 如何正确发送和接收放气数据
我正在使用 protobufs 来序列化我的数据。到目前为止,我在服务器上序列化了我的数据(节点 restify)发送它,接收它(请求由 XMLHttpRequest 发出)并在客户端上序列化它。
现在我想使用压缩来减少传输的文件大小。我尝试使用使用 zlib 的库pako。
在我用来比较 protobuf 和 zipping 性能与 json 的基本脚本中,我以这种方式使用它,没有问题
但是,如果我尝试在客户端-服务器模型中执行此操作,我将无法使其正常工作。
服务器:
我自己的proto
库将 protobuf 中的数据序列化,然后将其放气:
请求如下所示:
proto.decode 方法首先膨胀缓冲区buffer = pako.inflate(buffer);
,然后从 Protobuf 反序列化它。
如果发出请求,我会收到以下错误:pako 的 inflate 方法返回“未捕获的错误标头检查” :
我还查看了 Postman 中的请求,发现以下内容:放气的响应如下所示:120,156,60,221,119,64,21,237,119,39,240,247,246,242,10,49,191,244,178,73,54,157
并且长度为 378564
没有放气的相同请求(protobuf)看起来像这样
�:�:
(� 0�8@H
(� 0�8@H
� (�0�8@�H
,长度为 272613。
我假设我在服务器端做错了什么,因为膨胀的请求比不使用压缩的请求大。它是内容类型的标题吗?我没主意了。
javascript - 使用 php-gzdeflate 和 pako-js
我正在尝试结合php-gzdeflate和pako。压缩我正在使用的字符串:
但我似乎无法使用 pako 读回这个字符串。我尝试了以下方法:
我收到此消息:未捕获的错误标头检查
有没有一种简单的方法可以使用 generic-php 进行压缩并使用 pako 进行膨胀?
到目前为止,我已经尝试添加从 1 到 9 的各种 gzdeflate “级别”,但它们似乎都没有任何区别。在这一点上,我只是在猜测。
如果可能的话,我们宁愿不安装任何特殊的 php 扩展
非常感谢您。
javascript - 在 Python 中使用 Pako 放气
我正在尝试压缩字典以访问 API。
我阅读了某人使用 JavaScript 和一个名为“pako”的库压缩数据的代码,并亲自尝试过。它完美地工作:
现在我想对 Python 做同样的事情:我尝试了以下方法,但结果不同并且不起作用:
有没有人理想的如何用 Python 解决这个问题?是否有与 Python 的 pako 类似的库?
javascript - 使用 Pako 提取 Javascript 中的 gzip 数据 - 编码问题
我正在尝试运行我期望的一个非常常见的用例:
我需要从 Amazon S3 下载一个 gzip 文件(包含复杂的 JSON 数据集),然后用 Javascript 解压缩(gunzip)它。除了最后的“充气”步骤外,我的一切工作正常。
我正在使用 Amazon Gateway,并确认网关正在正确传输压缩文件(使用 Curl 和 7-zip 来验证生成的数据是否来自 API)。不幸的是,当我尝试使用 Pako 对 Javascript 中的数据进行膨胀时,我遇到了错误。
这是我的代码(注意:response.data 是从 AWS 传输的二进制数据):
还尝试了一个版本,通过在 inflate 之前添加以下内容将二进制数据输入拆分为数组:
我怀疑我的数据编码存在某种问题,并且我没有将其转换为正确的格式,以使 Uint8Array 有意义。
谁能指出我正确的方向来完成这项工作?
为了清楚起见:
- 正如上面列出的代码,我得到一个缓冲区错误。如果我删除 Uint8Array,并尝试处理“result.data”,我会收到错误:“不正确的标头检查”,这让我怀疑这是我的数据的编码/格式问题。
原始文件在Java 中使用带有UTF-8 的GZIPOutputStream 进行压缩,然后存储为静态文件(即randomname.gz)。
该文件作为二进制文件通过 AWS 网关传输,因此它与原始文件完全相同,因此 'curl --output filename.gz {URLtoS3Gateway}' === 从 S3 下载的文件。
当我使用网关将二进制数据编码为“base64”时,我遇到了同样的基本问题,但并没有尝试很多,因为使用“真实”二进制数据似乎比添加 base64 更容易在中间进行编码/解码。如果这是需要的步骤,我可以将其重新添加。
我还尝试了在这个问题中途发现的一些示例处理:https ://github.com/nodeca/pako/issues/15 ,但这没有帮助(我可能误解了二进制格式 v.array v base64 )。
javascript - Pako 无法压缩在 python 中生成的 gzip 文件
我正在使用以下代码从 python 生成 gzip 文件:(使用 python 3)
但是,我现在正在尝试使用 Pako 库在 Javascript 中读取此文件(我使用的是 Angular 2):
但我在控制台中收到此错误:unknown compression method
. 我应该做其他事情来正确膨胀 gzip 文件吗?
javascript - 在javascript中解压缩超过2G的文件
我一直RawDeflate
在我的 javascript 代码中使用来解压缩文件。最近发现有时候会静默失败,追查到原来文件超过2G的情况。我尝试切换到,pako
但这也失败了(至少不是默默地)。有谁知道任何可以解压缩大于 2G 的文件的 JS 包?
这是我在浏览器控制台中得到的:
arrays - 解压节点js中的字节数组
我们目前在 android 有一个项目,公司想在服务器上做一些事情。使用 Node JS 的服务器端代码。我想做的事情看起来很简单,但我坚持下去。我们有一个压缩的长字节数组,在 android 项目中我有他的代码可以正常工作并解压缩字节数组。我想在 Node JS 中做同样的事情,但我得到了错误incorrect data check
。
这是我从文档中编写的代码,Pako
但正如我所说,它返回错误。
输入是完全相同的字节数组。任何帮助,将不胜感激。
jquery - JQuery $.get 和膨胀数据
我收到了一个小型浏览器应用程序,它获取一个二进制文件,解压缩它,然后在浏览器中显示它的内容。
但是,我无法将数据正确转换为字节数组,随后由于“无效的代码长度设置”而导致膨胀失败。
这是我的获取方法:
这是膨胀文件的方法:
我做转换错了吗?我可以排除文件已损坏,正如您在注释掉的行中看到的那样,我正在测试上传文件并且它有效。