JavaScript: 解压/解缩/解压缩/解无损压缩字符串

35

我正在寻找JavaScript字符串压缩算法的实现方式。

我希望在服务器端(Java)进行压缩,然后在客户端(JavaScript)进行解压缩。

我找到了以下资源:

在JavaScript中解压字符串
其中一个回答是针对不同的问题。其他答案也是用于ZIP格式的文件解压缩。

JavaScript 实现解压缩(可能仅适用于 FF 3.6)
这是最接近我所需要的。但是我想要一些备选方案。

有什么建议吗?
谢谢,Ondra

更新: 我有一个非常特定的用例,请不要回答“不要在JavaScript中处理”。 我正在编写一个“离线”报告工具(生成后,存储为静态文件),压缩可以为单个报告节省数兆字节。由于受其他应用程序的限制,我无法将其存储为 ZIP 文件。


3
主要问题在于JavaScript没有处理原始数据的功能。所有数字都是浮点数,所有字符串值都以UTF-16(2个字节字符)的形式保存。它没有“字节数组”数据类型,因此实现压缩/解压缩会更加困难和低效。 - Pointy
4
不正确,最近的 JavaScript 实现中有支持二进制数据的功能,基于 Typed Array 规范(http://www.khronos.org/registry/typedarray/specs/latest/)。 - Ondra Žižka
是的,那是真的 - 那肯定会很有帮助 :-) - Pointy
浏览器已经使用了你所需的C/C++实现,找到一种通过.js访问它的方法。我为了好玩写了一个本地的.js版本的JSON,但它比浏览器的C/C++实现慢了大约100倍。 - CS_2013
相关链接:这是Dean Edwards的Packer工具:http://dean.edwards.name/packer/ - Ondra Žižka
7个回答

10

10

我不知道你喜欢哪个,但是我喜欢以下这些实现:

第一个比第二个更快,通常我们可以确保快速的服务器,但是我们不知道客户端机器的性能。因此,我建议您选择js-deflate并调整您的Java(服务器端)以进行解压缩。

https://github.com/dankogai/js-deflate

http://code.google.com/p/gzipjs/


3
第二个网址(gzipjs)似乎没有在任何地方发布代码……或者我漏看了什么? - Tute
1
这应该是被接受的答案,伙计们。 - Ale Morales
我已经搜索了几个小时了,第一次跳过了这个答案,但它真的非常简单,是一个很好的解决方案。我一直在将其与LZMA进行基准测试,结果速度快了10倍,并且压缩效果相当! - Billy Moon
扩充数据的实际上不是使用inflate函数吗? - Jus12

7

3

2
这个例子:http://cheeso.members.winisp.net/srcview.aspx?dir=js-unzip 展示了如何使用JavaScript处理ZIP文件。我知道你需要的是ZLIB或DEFLATE压缩,而不是ZIP。但是,ZIP使用DEFLATE,在该示例的.js文件中,有一个InflatingReader类可以边读取边解压缩。

这个类公开了以下方法:

readByte()
   returns null when EOF is reached, or the value of the byte when successful.

readToEnd()
   returns an array of all bytes read, to EOF

beginReadToEnd(callback)
   async version of the above

readBytes(n)
   returns an array of n bytes read from the source.

beginReadBytes(n, callback)
   async version of the above

如果你想使用INFLATE,那么你可以直接使用这段代码。

如果你想使用ZLIB(也称为解压缩),则需要读取和验证2个字节的签名,然后才能读取压缩的字节并执行INFLATE。只需修改InflatingReader以读取和转储2个字节即可完成ZLIB。


第一个链接已经不再在线。 - heinob
是的,对不起,我知道。我会努力把它放到一个新的地方。 - Cheeso

2

-4
不要在 JavaScript 中这样做。它会很慢,而且 JS 在处理二进制数据方面表现不佳。
只需在服务器端使用 gzip 传输编码,您的浏览器将负责解压缩。

14
我不是在询问好坏,而是在寻找实现方法。-1. - Ondra Žižka
4
非常好的建议,@Ondra。如果你想做一些被许多专家认为是“不好的想法”的事情,你应该解释你的理由。 - Pointy
4
@Pointy: 我不同意。当然你是正确的,但如果有人要求一些非正统的东西,仅仅因为专业知识而摆出一个警告的手势可能并不是最好的选择。 - jAndy
4
问题在于仅从问题中很难确定提问者是一个完全的新手还是一位有经验的程序员。缺乏经验的编码人员可能会从这种建议中获益良多;实际上,在我看来,这种答案是Stackoverflow上最有用的东西。原始问题几乎没有解释目标的周边说明,因此根据纯粹的统计数据,假设需要一些基本建议是个不错的假设。 - Pointy
3
最近的JavaScript实现中,根据Typed Array规范,支持二进制数据。FYI。 - Ondra Žižka
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接