在 Javascript 中解压缩 bzip2 数据

Posted

技术标签:

【中文标题】在 Javascript 中解压缩 bzip2 数据【英文标题】:Decompressing bzip2 data in Javascript 【发布时间】:2019-04-08 06:26:50 【问题描述】:

我最终不得不使用如下所示的 javascript 文件中的一些数据:

注意:base64 仅供参考。

function GetTripsDataCompressed()  return 'QlpoOTFBWSZTWdXoWuEDCAgfgBAHf/.....=='; 

GetTripsDataCompressed() 返回一个 base64 字符串,该字符串派生为使用 JSON.NET 转换为 JSON 的对象数组,然后使用 @987654321 将结果字符串压缩为 bzip2 @ 将生成的内存流 Base64 编码。

这是我所拥有的,无法改变。

我正在努力寻找一个 bzip2 JavaScript 实现,它将获得以下结果:

var rawBzip2Data = atob(GetTripsDataCompressed());

并将 rawBzip2Data 转换回作为 JSON 数组的字符串。我不能使用 compressjs 之类的东西,因为我需要支持 IE 10,因为它使用 typed arrays,这意味着 IE10 支持已停止。

所以看来我最好的选择是https://github.com/antimatter15/bzip2.js,但是因为我没有创建一个存档并且只 bzip2 一个字符串,它在做之后会引发Uncaught No magic number found 的错误:

var c = GetTripsDataCompressed();
c = atob(c);
var arr = new Uint8Array(c);
var bitstream = bzip2.array(arr);
bzip2.simple(bitstream);

那么任何人都可以在这里帮助我使用符合 IE 10 的脚本从 JavaScript 解压缩 BZip2、Base64 编码的字符串吗?最终我不在乎它是使用 https://github.com/antimatter15/bzip2.js 还是其他一些原生 JavaScript 实现。

【问题讨论】:

【参考方案1】:

在我看来答案在自述文件中:

decompress(bitstream, size[, len]) 主要对单个块进行解压。如果它检测到它是最后一个块,它将返回 -1,否则它返回一个带有解压缩数据的字符串。如果要将输出限制为一定数量的字节,请设置 len 参数。

另外,请记住存储库没有附加许可证。如果您想使用该代码,您需要联系作者。鉴于存储库已有八年历史,这可能会很棘手。

另一方面,Bzip2 算法本身是开源的(类似 BSD 的许可证),因此您可以自己用 Javascript 重新实现它。这只是几百行相对简单的代码。

【讨论】:

与原始问题无关,但您对许可证的说明,默认情况下,github中的公共项目没有“开源”状态?如果您有关于此案的任何信息,请发给我:)。 @Yanis-git 是的,如果你没有在 Github 上提供许可证,它会使用原产国的默认版权法。这些很少允许 :) 它在 Github 的帮助页面上有所描述 - help.github.com/en/articles/licensing-a-repository。

以上是关于在 Javascript 中解压缩 bzip2 数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中解压缩巨大的 gz 文件和性能

golang 压缩在golang中解压缩字符串

Python:如何在 for 中解压缩多个值?

在 VB.net 中解压缩文件 [关闭]

如何在 .NET 中解压缩使用 Lempel-Ziv Haruyasu 算法压缩的字节?

在 Cordova 中解压缩多部分存档