V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yy1984
V2EX  ›  .NET

求C#字符串压缩

  •  
  •   yy1984 · 2013-09-24 08:47:46 +08:00 · 7924 次点击
    这是一个创建于 4103 天前的主题,其中的信息可能已经有所发展或是发生改变。
    网上搜索了一下,没一个能用的,基本上都是用GZip把1000字节压缩成1500字节,太蛋疼了。

    或者谁有这样的思路?我的字符串很简单,0-9还有“,”,共11种字符,但长度不限,想至少压缩一半的长度。
    9 条回复    1970-01-01 08:00:00 +08:00
    heganj
        1
    heganj  
       2013-09-24 09:27:54 +08:00
    转成16进制、甚至36进制压缩、如果数字没有Long的最大值大,可以考虑writeLong和ReadLong。这两点是起码能想到的
    luikore
        2
    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
        3
    webflier  
       2013-09-24 09:40:26 +08:00   ❤️ 1
    LZ4
    https://code.google.com/p/lz4/
    有c#的版本。
    速度快,json,xml之类的文本能压缩一半。
    yushiro
        4
    yushiro  
       2013-09-24 10:12:57 +08:00
    @webflier 这个不错,收藏了~
    mikawudi
        5
    mikawudi  
       2013-09-24 13:59:04 +08:00
    通讯端和服务端都是自己写的话....编码下不就好了.....11种字符用4位做编码,一个byte高4位一个字符,低四位一个字符....完事了,和ascii比正好压缩一半长度
    luikore
        6
    luikore  
       2013-09-24 18:41:48 +08:00
    @webflier 楼主的数据是 gzip 后反而变长, LZ4 LZW LZSS LZMA 等估计也没效果
    webflier
        7
    webflier  
       2013-09-24 20:30:42 +08:00 via Android
    @luikore 是,我没仔细看就回复了。楼主的文本涉及的字符比较少,可用伙夫慢树写一个简单的算法,再结合5楼的方法。。。。。压缩率应该挺好看的
    luikore
        8
    luikore  
       2013-09-24 20:44:42 +08:00
    @webflier gzip 就是滑动窗口字典(LZ77)结合霍夫曼编码...
    mikawudi
        9
    mikawudi  
       2013-09-26 17:31:50 +08:00
    哈夫曼编码在这没啥用,毕竟表示的位数本来就很短...哈夫曼编码后,间隔符浪费的空间占比都很大....话说才看到2L大哥的编码方式....貌似只要7位的说....比BCD编码强不过'0'->0不大好吧,不然连续的多个0会被识别成串尾
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3223 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 12:26 · PVG 20:26 · LAX 04:26 · JFK 07:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.