支持二进制数据的javascript压缩算法?

Posted

技术标签:

【中文标题】支持二进制数据的javascript压缩算法?【英文标题】:javascript compression algorithm that supports BINARY data? 【发布时间】:2012-04-12 23:24:09 【问题描述】:

我正在寻找一种在 javascript 中接受并返回原始二进制数据的无损压缩算法(如 LZW 或 Huffman 或其他任何东西)。

对于“二进制数据”,我指的是一个字节序列,它可以采用以下任何一种形式:

一个字符串,包含从 0 到 255 的任意值的字符 一个包含 0 到 255 之间任意值的整数的数组 包含数据的十六进制表示的字符串(即每个字节 2 个十六进制数字) 包含数据的 base64 编码表示的字符串 或任何其他可以明确转换为上述任何内容的内容

现在显然有大量的 javascript 实现随处可用,适用于各种算法。然而,我发现的一切似乎都在做一些疯狂的事情,比如:

返回一个包含值 >255 的数组(那么现在的压缩比是多少?如何以字节为单位表示,或者如何将其保存到文件中?)

弄乱字符串中的字符编码,从/到 unicode 或 url/html 实体或诸如此类的转换(它是 BINARY,字符编码不适用于此处!)

返回其他似乎不适合二进制存储的表示(即不能转换为字节序列)

有人知道适合我的二进制恋物癖的良好 javascript 压缩(+解压缩)实现吗?

【问题讨论】:

请记住,“低级”程序员直到最近才开始注意到 JavaScript,甚至出现了能够处理重要数据的快速 JIT。同样,请务必进行良好的测试,因为即使在现代浏览器之间,性能也存在很大差异。 谢谢,会的。我通常希望处理高达 10 或 15 KB 的数据块,即没有那么多,所以我希望客户能够在没有太多延迟的情况下压缩它。我使用压缩的原因是我希望 LOTS 客户端同时提交这样的数据块,所以任何可以降低服务器负载(通过压缩单个块客户端)的东西都会对我有所帮助。跨度> 这对于 JavaScript 来说是很多数据。这是一种语言,其中数组只是带有数字键的字典。因此,一个 10,000 个元素的数组可能是一个 10,000 个条目的哈希表,其中包含一个幼稚的 JS 实现和一个糟糕的 JIT。一年前我看到了一个类似的问题,当时发送二进制数据似乎是最前沿的。我现在看到了更多的在线资源,但您可能走在了潮流的前面。 超过 10 KB 的情况很少见,而且我已经用几种算法进行了测试,它们似乎可以立即执行压缩(除了它们以一种不容易的方式输出压缩结果转换为最小字节序列或base64字符串) 好吧,Firefox 在数以万计的数据点上运行 Highcharts 的速度比 Safari 快得多,物有所值。现在环顾四周,我从 WebGL 库中看到了很多关于 ArrayList 类的信息。这显然是二进制 JavaScript(并包括 AJAX 接口)的新亮点,因此您可能会寻找使用它的库。 【参考方案1】:

我想我终于找到了我想要的东西:this deflate + inflate implementation in javascript 似乎可以将字符串作为字节序列使用。

【讨论】:

【参考方案2】:

首先创建一个闭包来保存二进制或十六进制或十进制标志

function ASearch()  
ASearch.Flag = 
    Front_Wheel_Drive: 0xF, Rear_Wheel_Drive: 0xF0, Four_Wheel_Drive: 0xF00,
    Auto: 0xFF, Manual: 0xFF00,
    Gas: 0xF, Diesel: 0xF0, Hybrid: 0xF00, Electrical: 0xF000,
    Two: 1, Three: 2, Four: 4, Five: 8, Six: 16, Eight: 32, Ten: 64, Twelve: 128
;

然后这样设置

SetFlag = (function (e) 
   e = e.srcElement;
   $("#" + e.parentNode.name).val(e.checked ?
        $("#" + e.parentNode.name).val() | ASearch.Flag[e.id] :
        $("#" + e.parentNode.name).val() ^ ASearch.Flag[e.id]);
);

这是一个 32 位整数打包数据的示例

有四个变量...我已经将它们用于 18 个标志...这是快速且超级有效的

例如...

int i = 0; //binary = 0000 0000 0000 0000

i = i | 255; //binary = 0000 0000 1111 1111

i = i ^ 255; //binary = 0000 0000 0000 0000

i = i | 0xFF00; //binary = 1111 1111 0000 0000

i = i | 255; //binary = 1111 1111 1111 1111

i = i ^ 0xFF00; //binary = 0000 0000 1111 1111

【讨论】:

Ehhr.. 我看不出这与我的问题有什么关系?我了解如何使用位或二进制标志。只是压缩算法返回,例如 [45,281,12,1134,98] 之类的东西,它不会自动转换为字节序列(当然,我可以将每个整数存储 4 个字节,但这有点破坏压缩的全部目的)。 对不起,我真的不知道你要去哪里。我了解位、二进制标志和运算符。真的,我愿意。我的问题是关于压缩算法,以及它们返回似乎不适合有效存储为字节序列的数据的方式。没有涉及任何标志或 srcElement 或父节点或节点。

以上是关于支持二进制数据的javascript压缩算法?的主要内容,如果未能解决你的问题,请参考以下文章

动态规划——用二进制表示集合的状态压缩DP

自制压缩软件

数据压缩算法

数据压缩算法

以二进制形式读取文件,将其压缩并以二进制形式写回

Elasticsearch之数据压缩算法