求C#字符串压缩

2013-09-24 08:47:46 +08:00
 yy1984
网上搜索了一下,没一个能用的,基本上都是用GZip把1000字节压缩成1500字节,太蛋疼了。

或者谁有这样的思路?我的字符串很简单,0-9还有“,”,共11种字符,但长度不限,想至少压缩一半的长度。
7685 次点击
所在节点    .NET
9 条回复
heganj
2013-09-24 09:27:54 +08:00
转成16进制、甚至36进制压缩、如果数字没有Long的最大值大,可以考虑writeLong和ReadLong。这两点是起码能想到的
luikore
2013-09-24 09:35:10 +08:00
11*11=121

先用表 ('0'-'9' => 0-9, ',' => 10) 转换成 0-10 的整数, 然后两字节压成一字节即可:
result = b1 * 11 + b2

解压时 b2 = result % 11; b1 = (result - b2) / 11 再查表还原
webflier
2013-09-24 09:40:26 +08:00
LZ4
https://code.google.com/p/lz4/
有c#的版本。
速度快,json,xml之类的文本能压缩一半。
yushiro
2013-09-24 10:12:57 +08:00
@webflier 这个不错,收藏了~
mikawudi
2013-09-24 13:59:04 +08:00
通讯端和服务端都是自己写的话....编码下不就好了.....11种字符用4位做编码,一个byte高4位一个字符,低四位一个字符....完事了,和ascii比正好压缩一半长度
luikore
2013-09-24 18:41:48 +08:00
@webflier 楼主的数据是 gzip 后反而变长, LZ4 LZW LZSS LZMA 等估计也没效果
webflier
2013-09-24 20:30:42 +08:00
@luikore 是,我没仔细看就回复了。楼主的文本涉及的字符比较少,可用伙夫慢树写一个简单的算法,再结合5楼的方法。。。。。压缩率应该挺好看的
luikore
2013-09-24 20:44:42 +08:00
@webflier gzip 就是滑动窗口字典(LZ77)结合霍夫曼编码...
mikawudi
2013-09-26 17:31:50 +08:00
哈夫曼编码在这没啥用,毕竟表示的位数本来就很短...哈夫曼编码后,间隔符浪费的空间占比都很大....话说才看到2L大哥的编码方式....貌似只要7位的说....比BCD编码强不过'0'->0不大好吧,不然连续的多个0会被识别成串尾

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/83432

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX