ironer / base62shrink
简单的javascript脚本,用于对较长的结构化或重复的UTF8数据进行LZW压缩(如JSON字符串化),转换为通用且安全的Web格式。简单的PHP类,用于服务器端数据处理。
This package is not auto-updated.
Last update: 2024-09-23 13:36:55 UTC
README
简单的javascript脚本,用于对较长的结构化或重复的UTF8数据进行LZW压缩(如JSON字符串化),转换为通用且安全的Web格式。简单的PHP类,用于服务器端数据处理。
新增:可以将压缩后的base8数据编码为base32k,以存储在本地存储中。
使用来源
- LZW压缩: http://rosettacode.org/wiki/LZW_compression#JavaScript
- UTF8编码与解码: http://ecmanaut.blogspot.cz/2006/07/encoding-decoding-utf8-in-javascript.html
- Base32k编码与解码: http://lists.xml.org/archives/xml-dev/200307/msg00505.html
Base62shrink使用LZW压缩和一些javascript数据转换来防止位信息的浪费,并将结果LZW索引数组编码为安全的字符(a-zA-Z0-9)的base62字符串。因此,在某些数据示例中,base62编码的数据比标准的base64编码函数增加了33%。
可能是某些压缩中使用的相同原理,但我找不到简单而简短的。
如果有人想知道代码是如何工作的,这里有一些简短的描述
-
UTF8编码的字符串被LZW压缩为字典中连接子字符串的整数索引数组。
-
数组中的整数将被压缩,每个整数都被编码为base6,然后整个数组转换为带有分隔符的字符串,并将负号替换为'6'和'7'以获得base8字符串。
-
整数数组的位长度通过将除了第一个元素之外的所有元素替换为从上一个元素计算的整数来压缩。
-
数组中的delta从base10转换为base6,以便进行进一步的压缩。
-
数组通过字符'6'作为分隔符连接成字符串。
-
在base6中,在负delta之前出现的所有'6'分隔符被替换为'7',并删除负号。
-
-
步骤2的结果base8字符串将被编码为base62。2个字符转换为1个字符。
-
在字符串的开始处添加额外的base8值作为在末尾添加冗余字符的标志。因此,奇数长度的字符串只在开始处添加标志值以提供偶数长度,而偶数长度的字符串在开始处和末尾有不同的标志值和冗余值以提供偶数长度。
-
数字7代表base8字符串中的分隔符后面跟负号,因此它永远不会直接跟在6或7(分隔符或分隔符加负号)后面。这就是为什么base8字符串中连续两个字符的最高值不会超过base10中的61,因此使用的base62足够。
-
编码到base62相当直接,因为base8字符串现在是偶数长度,并且每个连续字符对代表62个值中的一个。
-
-
如上所述,数字7后面永远不会跟6或7。反之亦然。因此,在八进制字符串中永远不会出现'66'或'67',这使得来自62进制编码字符串的索引54和55('2'和'3')的字符未被使用。八进制字符串中的'70'组合也是不可能的,因为这代表:分隔符后跟负号后跟零,所以索引56('4')的字符也不会出现在结果62进制字符串中。因此,字符'2'、'3'和'4'可以用作编码字符串的分隔符或文件结束符。
也许有人觉得这个脚本有用;(-)