我正在寻找一个 JavaScript 函数,它给定一个字符串,返回一个压缩的(较短的)字符串。

我正在开发一个将长字符串 (HTML) 保存到本地数据库的 Chrome 网络应用程序。 出于测试目的,我尝试压缩存储数据库的文件,它缩小了五倍,所以我认为如果我压缩它存储的内容,它将有助于保持数据库更小。

我在 JavaScript 中找到了 LZSS 的实现: http : //code.google.com/p/u-lzss/ (“U-LZSS”)。

当我使用简短的示例字符串(解码 === 编码)“手动”测试它时,它似乎有效,而且在 Chrome 中它也相当快。 但是当给定大字符串(100 ko)时,它似乎会混淆/混淆字符串的后半部分。

U-LZSS 是否可能需要较短的字符串而无法处理较大的字符串? 是否可以调整一些参数以移动该上限?

#1楼 票数:37

我刚刚发布了一个小型LZW实现,专门为此目的量身定制,因为现有的实现都不能满足我的需求。

这就是我正在使用的东西,我可能会在某个时候尝试改进库。

#2楼 票数:14

这是我在一个完整的演示中从 LZW 修改的编码(276 字节,函数 en)和解码(191 字节,函数 de)函数。 互联网上没有比我在这里给你的更小或更快的例程。

 function en(c){var x='charCodeAt',b,e={},f=c.split(""),d=[],a=f[0],g=256;for(b=1;b<f.length;b++)c=f[b],null!=e[a+c]?a+=c:(d.push(1<a.length?e[a]:a[x](0)),e[a+c]=g,g++,a=c);d.push(1<a.length?e[a]:a[x](0));for(b=0;b<d.length;b++)d[b]=String.fromCharCode(d[b]);return d.join("")} function de(b){var a,e={},d=b.split(""),c=f=d[0],g=[c],h=o=256;for(b=1;b<d.length;b++)a=d[b].charCodeAt(0),a=h>a?d[b]:e[a]?e[a]:f+c,g.push(a),c=a.charAt(0),e[o]=f+c,o++,f=a;return g.join("")} var compressed=en("http://www.ScriptCompress.com - Simple Packer/Minify/Compress JavaScript Minify, Fixify & Prettify 75 JS Obfuscators In 1 App 25 JS Compressors (Gzip, Bzip, LZMA, etc) PHP, HTML & JS Packers In 1 App PHP Source Code Packers Text Packer HTML Packer or v2 or v3 or LZW Twitter Compress or More Words DNA & Base64 Packer (freq tool) or v2 JS JavaScript Code Golfer Encode Between Quotes Decode Almost Anything Password Protect Scripts HTML Minifier v2 or Encoder or Escaper CSS Minifier or Compressor v2 SVG Image Shrinker HTML To: SVG or SVGZ (Gzipped) HTML To: PNG or v2 2015 JS Packer v2 v3 Embedded File Generator Extreme Packer or version 2 Our Blog DemoScene JS Packer Basic JS Packer or New Version Asciify JavaScript Escape JavaScript Characters UnPacker Packed JS JavaScript Minify/Uglify Text Splitter/Chunker Twitter, Use More Characters Base64 Drag 'n Drop Redirect URL DataURI Get Words Repeated LZMA Archiver ZIP Read/Extract/Make BEAUTIFIER & CODE FIXER WHAK-A-SCRIPT JAVASCRIPT MANGLER 30 STRING ENCODERS CONVERTERS, ENCRYPTION & ENCODERS 43 Byte 1px GIF Generator Steganography PNG Generator WEB APPS VIA DATAURL OLD VERSION OF WHAK PAKr Fun Text Encrypt Our Google"); var decompressed=de(compressed); document.writeln('<hr>'+compressed+'<hr><h1>'+compressed.length+' characters versus original '+decompressed.length+' characters.</h1><hr>'+decompressed+'<hr>');

#3楼 票数:7

看来,有一个压缩/解压缩API的提议: https : //github.com/wicg/compression/blob/master/explainer.md

根据https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html上的博客文章,它在 Chrome 80(目前处于 Beta 版)中实现。

我不确定我是否在流和字符串之间进行了良好的转换,但这是我尝试使用新 API:

 function compress(string, encoding) { const byteArray = new TextEncoder().encode(string); const cs = new CompressionStream(encoding); const writer = cs.writable.getWriter(); writer.write(byteArray); writer.close(); return new Response(cs.readable).arrayBuffer(); } function decompress(byteArray, encoding) { const cs = new DecompressionStream(encoding); const writer = cs.writable.getWriter(); writer.write(byteArray); writer.close(); return new Response(cs.readable).arrayBuffer().then(function (arrayBuffer) { return new TextDecoder().decode(arrayBuffer); }); } const test = "http://www.ScriptCompress.com - Simple Packer/Minify/Compress JavaScript Minify, Fixify & Prettify 75 JS Obfuscators In 1 App 25 JS Compressors (Gzip, Bzip, LZMA, etc) PHP, HTML & JS Packers In 1 App PHP Source Code Packers Text Packer HTML Packer or v2 or v3 or LZW Twitter Compress or More Words DNA & Base64 Packer (freq tool) or v2 JS JavaScript Code Golfer Encode Between Quotes Decode Almost Anything Password Protect Scripts HTML Minifier v2 or Encoder or Escaper CSS Minifier or Compressor v2 SVG Image Shrinker HTML To: SVG or SVGZ (Gzipped) HTML To: PNG or v2 2015 JS Packer v2 v3 Embedded File Generator Extreme Packer or version 2 Our Blog DemoScene JS Packer Basic JS Packer or New Version Asciify JavaScript Escape JavaScript Characters UnPacker Packed JS JavaScript Minify/Uglify Text Splitter/Chunker Twitter, Use More Characters Base64 Drag 'n Drop Redirect URL DataURI Get Words Repeated LZMA Archiver ZIP Read/Extract/Make BEAUTIFIER & CODE FIXER WHAK-A-SCRIPT JAVASCRIPT MANGLER 30 STRING ENCODERS CONVERTERS, ENCRYPTION & ENCODERS 43 Byte 1px GIF Generator Steganography PNG Generator WEB APPS VIA DATAURL OLD VERSION OF WHAK PAKr Fun Text Encrypt Our Google"; async function testCompression(text, encoding = 'deflate') { console.log(encoding + ':'); console.time('compress'); const compressedData = await compress(text, encoding); console.timeEnd('compress'); console.log('compressed length:', compressedData.byteLength, 'bytes'); console.time('decompress'); const decompressedText = await decompress(compressedData, encoding); console.timeEnd('decompress'); console.log('decompressed length:', decompressedText.length, 'characters'); console.assert(text === decompressedText); } (async function () { await testCompression(test, 'deflate'); await testCompression(test, 'gzip'); }());

#4楼 票数:5

对我来说,使用 UTF-8 作为目标来压缩字符串似乎并不合理......看起来只是在寻找麻烦。 我认为最好放弃一些压缩并使用普通的 7 位 ASCII 作为目标。

在我为了好玩而编写的玩具4 KB JavaScript 演示中,我对压缩结果使用了一种编码,该编码将四个二进制字节存储到五个字符中,这些字符是从 85 个字符的 ASCII 子集中选择的,这些字符很干净,可以嵌入 JavaScript 字符串 (85^5略大于 8^4,但仍符合 JavaScript 整数的精度)。 这使得压缩数据安全,例如JSON ,无需任何转义。

#5楼 票数:5 已采纳

在 Piskvor 的建议下,我测试了在这个问题的答案中找到的代码: Gzip 的 JavaScript 实现(最高投票答案:LZW 实现)并发现:

  1. 它有效
  2. 它将数据库的大小减少了两倍

... 小于 5 但总比没有好! 所以我用了那个。

(我希望我能接受 Piskvor 的回答,但这只是评论)。

#6楼 票数:1

我认为您还应该查看lz-string它的压缩速度非常快,并且在其页面上列出了一些优点:

其他图书馆呢?

  • 一些 LZW 实现为您提供数字数组(存储为 64 位的令牌效率极低)并且不支持任何大于 255 的字符。
  • 一些其他的 LZW 实现会返回一个字符串(存储效率较低,但仍然需要 16 位)并且不支持任何大于 255 的字符。
  • 一个异步且非常慢的 LZMA 实现 - 但是,嘿,这是 LZMA,而不是缓慢的实现。
  • 一个 GZip 实现并不是真正适用于浏览器,而是适用于 node.js,它的权重为 70kb(它依赖于 deflate.js 和 crc32.js)。

作者创建lz-string的原因:

  • 在移动设备上工作我需要一些快速的东西。
  • 使用从我的网站外部收集的字符串,我需要一些可以将任何类型的字符串作为输入的东西,包括 255 以上的任何 UTF 字符。
  • 不占用 70kb 的库是一个明确的加分项。 产生尽可能紧凑的字符串以存储在 localStorage 中的东西。 所以我在网上找不到的图书馆都不能很好地满足我的需求。

这个库有其他语言的实现,我目前正在研究python的实现,但目前解压似乎有问题,但如果你只坚持使用JS,它对我来说看起来真的很好。

#7楼 票数:1

在实施任何事情之前尝试使用文本文件进行试验,因为我认为以下不一定成立:

所以我想如果我压缩它存储的东西,它会帮助保持数据库更小。

那是因为无损压缩算法非常适合重复模式(例如空白)。

  ask by Bambax translate from so

未解决问题?本站智能推荐:

1回复

JavaScript中的无损压缩运行长度编码

对于我的作业,我正在编写代码来进行压缩,然后通过javascript中的无损压缩对字符串进行解压缩。 例如- 原始字符串:heeeeelllllloo 压缩:h1e5l6o2 解压:heeeeelllllloo 这段代码作为一个无限循环出现,问题出在压缩函数中。 请帮助
1回复

在 HTML 页面中播放 .m4a 音频文件不起作用

我正在尝试在网页上播放m4a文件,但它不起作用。 我在 iPhone 上使用语音备忘录应用程序来生成这些文件。 我注意到以下(调查结果): 当我将我的设置 IOS > 设置 > 语音备忘录 > 音频质量切换到压缩时,它可以工作。 当我将我的设置 IOS > 设置
2回复

Java 中冗长的字符串压缩/解压

我正在寻找字符串长度压缩以避免如下冗长的文件名。 该字符串也包含 UTF-8 字符。 “dt=20200623_isValid=valid_module_name=A&B&C_data_source=internet_part-00001-1234-9d12-1234-123
1回复

在将大字符串发送到服务器之前是否有任何有效的方法来压缩javascript中的字符串,反之亦然?

我目前正在使用google chrome扩展程序,在该扩展程序中,我必须获取页面的屏幕截图并将其发送到我们的服务器,但是问题是,截取屏幕截图后生成的字符串太大了,发送它变得有点困难通过获取请求。 那么,javascript中是否有任何有效的方法/算法/ API可以对它们进行压缩和解压缩?
2回复

如何在不丢失太多信息的情况下将对象压缩为字符串

试图弄清楚如何创建一个可以基于文本文件创建对象的类。 如果接口Readable具有String asString()方法,并且类中的Readable read(String s)方法将基于字符串s构造一个Readable对象,从而实现(read(String s).asString())。等于
1回复

单击Javascript替换网页中字符串的所有实例。

好的,我要制作一个Chrome扩展程序,我希望它具有2个按钮,一个用于打开扩展程序,一个用于关闭扩展程序。 在扩展程序运行时,我希望将网页上的所有实例从“ ab”替换为“ ef”(仅作为示例)。 这意味着用户单击后,该扩展名将始终在每个网页上将“ ab”转换为“ ef”,而不必每次都将其打开
1回复

链接的Javascript字符串变量

我正在做一个chrome扩展程序,我想将我的javascript字符串变量转换为可点击的链接。 这就是我的代码现在所做的, 这会在页面上找到一种格式,例如stack / overflow#12453。 我用此功能将正则表达式转换为字符串 我想做的就是将该字符串变成可点击的链接
3回复

从javascript中的字符串替换或删除字符不起作用

如果我选择一个单词并且其中包含“”,则希望将其删除或替换为空格。 例如,如果我有一个句子:“ king's bed”,而我选择了“ king's bed”,则希望它仅出现在“ king”变量中。 我尝试了这段代码,但是没有用 它给了我这个错误: