Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:解压/充气/解压/解压字符串_Javascript_Gzip_Unzip_Inflate_Compression - Fatal编程技术网

JavaScript:解压/充气/解压/解压字符串

JavaScript:解压/充气/解压/解压字符串,javascript,gzip,unzip,inflate,compression,Javascript,Gzip,Unzip,Inflate,Compression,我正在寻找字符串膨胀算法的JavaScript实现。 我想在服务器端(Java)压缩,在客户端(JavaScript)解压缩 我发现: 该问题被标记为已回答,并带有不同问题的答案。其他答案也适用于其他内容(以ZIP格式解压缩文件) 这是最接近我需要的。不过我想有一些选择 建议? 谢谢,昂德拉 更新: 我有一个非常具体的用例,请不要回答“不要在JavaScript中这样做” 我正在编写一个“离线”报告工具(一旦生成,它就被放在静态存储中),而deflating可以为单个报告节省兆字节。我受到其

我正在寻找字符串膨胀算法的JavaScript实现。 我想在服务器端(Java)压缩,在客户端(JavaScript)解压缩

我发现:


该问题被标记为已回答,并带有不同问题的答案。其他答案也适用于其他内容(以ZIP格式解压缩文件)


这是最接近我需要的。不过我想有一些选择

建议?
谢谢,昂德拉

更新: 我有一个非常具体的用例,请不要回答“不要在JavaScript中这样做”
我正在编写一个“离线”报告工具(一旦生成,它就被放在静态存储中),而deflating可以为单个报告节省兆字节。我受到其他应用程序的限制,因此无法将其存储为zip文件。

不要在JavaScript中这样做。这会很慢,而且JS不能很好地处理二进制数据


只需在服务器端使用gzip传输编码,您的浏览器将负责对其进行解压缩。

请看,其中的答案包含对使用javascript实现的多个压缩引擎的引用。大多数都是基于LZ77的。

我不知道您会怎么想,但我喜欢这些实现:

第一个比第二个快,我们通常可以确保服务器速度快,但是我们不知道客户端机器的性能。因此,我建议您选择js deflate并调整java(服务器端)使其膨胀

这个例子: 显示如何在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
如果需要,可以不加更改地使用该代码


如果您想要(aka unzip),那么在读取压缩字节并进行充气之前,您需要读取并验证一个2字节的签名。只需修改InflingReader以读取和转储2个字节,它就可以很好地处理ZLIB

我在这里找到了一个有效的充气实现:

如果您想要一个稍微干净一点的版本来命名算法,这个版本应该可以:


请记住,gzip压缩的“充气”数据的前缀是一个两字节的头,后缀是一个四字节的校验和,在传递到算法之前,您需要去掉它。

有一个图形库,它包含一个javascript中的zlib实现。如果你向下滚动一点这个页面,你会看到它作为一个单独的下载。

我使用
pako
、现代快速
Zlib
端口创建了一个工作示例。

我不是在问它是好是坏。我正在寻找实现-“这是个很好的建议,”昂德拉说。如果你想做一些被许多有专业知识的人认为是“坏主意”的事情,你应该解释你的理由。@Pointy:我不同意。当然你是对的,但是如果有人要求一些非正统的东西,那么不管专业知识如何,摇一摇手指可能不是最好的办法。@jAndy问题是,仅仅从问题中就很难判断提问者是一个完全的新手还是一个有经验的程序员。没有经验的程序员可能会从这类建议中受益匪浅;事实上,在我看来,这种回答是Stackoverflow上最有用的。最初的问题几乎不包含对目标的外围解释,因此基于纯粹的统计,假设需要一些基本建议是一个很好的假设。仅供参考,最近的JavaScript实现中支持二进制数据,主要问题是JavaScript没有处理原始数据的工具。所有数字都是浮点数,所有字符串值都保留为UTF-16(2字节字符)。没有“字节数组”数据类型,所以压缩/解压缩的实现更加困难,效率也更低。不正确,在最近JavaScript实现中支持二进制数据,基于。是的,这肯定是有用的:-浏览器已经使用了C/C++实现了你所需要的,找到一种通过.js访问它的方法。为了好玩,我编写了一个JSON的原生版本。它比BrSuver的C/C++实现慢了大约100倍。这里是Dean Edwards的打包器:第二个URL(GZIPJS)没有任何代码发布在任何地方…还是我遗漏了什么?这应该是公认的答案,伙计们。我已经搜索了好几个小时了,第一次跳过了这个答案,但这确实是一个非常简单、非常好的解决方案。我已经将它与LZMA进行了基准测试,它的速度快了10倍,并且具有相当的压缩能力!膨胀不是在扩展数据吗?第一个链接不再在线了。是的,对不起,我知道。我会努力把它搬到一个新的地方。