求网络数据高效的压缩方法!!

micr0soft 2010-04-25 01:59:39
我需要比较大的浮点数据传输,尽管我将浮点数转换成整数,然后使用7Z格式压缩,但压缩也只是50%左右,似乎数据压不下来,但是我奇怪的是为什么TXT文件和EXE文件就能达到很高的压缩比,我如何能将数据也跟他们一样压缩那么高?
...全文
280 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
尹成 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xianglitian 的回复:]
你的浮点数据是怎么来的
如果是通过某种计算可以考虑把原数据发过去
对方接收后自行计算
[/Quote]

是不是和文件内容有关系才压不下来啊。我觉得4 楼的方法可以一试。应该可以解决问题!
lmxmx 2010-04-26
  • 打赏
  • 举报
回复
我不知道LZ的数有多大,必须使用压缩算法 --b

其实,对于一般的大数,传输时是没有必要压缩的。

我前两天在做毕业设计,
client与server之间是通过RSA验证身份的,用于取模的N是1024比特。
client和client使用DH协商密钥,参数P是2048比特。
这些大数在网络上传来传去,也没出现什么问题……(我还把他们转换成了BASE64)

lmxmx 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 micr0soft 的回复:]
回楼上,你的回答非常好,请问我如何能在目前有限的条件下提高压缩比呢?
[/Quote]

目前有限的条件下,二进制大数的压缩比也就如此了,因为二进制数没有被压缩的空间……

[Quote=引用 7 楼 micr0soft 的回复:]
是不是将二进制转变字符串格式后再压缩会提高比例?
[/Quote]

不是的。
我在5楼的最后说过,二进制转变字符是数据体积会先膨胀2被(ascII码)。
因此,就算压缩率达到50%,也不过是回到了原本二进制数据的大小。
更何况,二进制转变字符串后,字符串中的字符是随机的,无法有效压缩。

我简单算了一下,
例如0xAC0D1B2537AE2358有64比特,
转换为字符串“AC0D1B2537AE2358”有128比特,
统计时去除没有出现的4,6,9,F后,生成编码后为87比特。
就是说,如果转到字符串后再压缩,结果竟然将一个64比特的数据“压缩”成了87比特,囧……

所以建议LZ还是使用7Z吧,虽然压缩比不高,但是至少不会出错……
lmxmx 2010-04-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gordon3000 的回复:]
5楼原理上貌似不通。
二进制转换成文本的过程文件就膨胀了许多,虽然看起来压缩比高了,但是最终你压缩结果是不会比二进制文件小的。
[/Quote]

确实如此,最开始我没想到太过深入。
对于纯二进制大数,目前还没有什么高效的压缩方法。

我在5楼说的赫夫曼编码的方法,仅对拥有实际语义的字符串有效。
例如:对于字符串“I am a student.”来说,利用有效压缩。
但是对于数字0xA5DF55B3C1D转换的字符串“A5DF55B3C1D”来说,
字符串中0-9,A-F是随机出现的,压缩率就非常囧了。
而且转化到字符串本身就膨胀了2倍(ASCII),UNICODE的话就是4被,失去了压缩的意义。

而我在3楼说的二进制转换到字符串,是因为网上的数据交换多用HEX字符串或Base64字符串,使我犯了想当然的错误。^_^

butwang 2010-04-26
  • 打赏
  • 举报
回复
这个是由数据本身决定的,
文本数据重复率高吧,
浮点数据几乎没有重复吧
SullenSun 2010-04-26
  • 打赏
  • 举报
回复
数据有规律就自己编码解码,否则还是用别人的吧。
副组长 2010-04-25
  • 打赏
  • 举报
回复
5楼原理上貌似不通。
二进制转换成文本的过程文件就膨胀了许多,虽然看起来压缩比高了,但是最终你压缩结果是不会比二进制文件小的。
jbz001 2010-04-25
  • 打赏
  • 举报
回复
你的数据量有多少
如果太少的话,那么压缩率就不是很低了
踏实每一步 2010-04-25
  • 打赏
  • 举报
回复
mark
micr0soft 2010-04-25
  • 打赏
  • 举报
回复
是不是将二进制转变字符串格式后再压缩会提高比例?
micr0soft 2010-04-25
  • 打赏
  • 举报
回复
回楼上,你的回答非常好,请问我如何能在目前有限的条件下提高压缩比呢?
lmxmx 2010-04-25
  • 打赏
  • 举报
回复
LZ说的TXT和EXE压缩率高,因为TXT文件和EXE文件通常比较大,

所以可以对其文件中出现的编码进行统计,然后优化编码。

例如TXT文件可以统计其中字符的出现频率,根据频率生成相应的赫夫曼编码,

而赫夫曼编码是不定长的,所以一个字符的霍夫曼编码可能还不到8比特。

====================================================================================

例如:字符串“AAAABBCC”,64比特,

在经过赫夫曼编码后,A编码为0,B编码为10,C编码为11,

则字符串“AAAABBCC”转化为二进制为 000010101111,仅有12比特。压缩率为12/64=0.333=33.3%

====================================================================================

而你的浮点数是一串二进制,转换为整数后依然是二进制,

例如二进制数 1010,1010,0110,0100,0111,1110 . 1010,1010,1010,1010,0010

你是无法有效压缩的,因为假设每4比特为一组,每组有16种组合,且出现频率不定,

所以赫夫曼编码最长可能要16比特,最短1比特,平均要8比特,

4比特为一组进行压缩后,反而每组变成8比特了!!!!压缩后变大了一倍!!!!

向立天 2010-04-25
  • 打赏
  • 举报
回复
你的浮点数据是怎么来的
如果是通过某种计算可以考虑把原数据发过去
对方接收后自行计算
lmxmx 2010-04-25
  • 打赏
  • 举报
回复
既然TXT文本压缩率高,

你可以试着将你的浮点数由二进制转换成HEX字符串或者BASE64字符串,

然后再进行压缩……
sunlin7 2010-04-25
  • 打赏
  • 举报
回复
原始数据的二进制格式直接压缩试试
副组长 2010-04-25
  • 打赏
  • 举报
回复
都是使用现有方法,你如果怀疑的话可以对不同的文件类型求一下熵,如果熵接近又有明显的压缩比差异,那到真的值得怀疑了。
怎么感觉你将浮点数转换成整型再压缩熵会增加呢,不会提高压缩比吧?
sgzwiz 2010-04-25
  • 打赏
  • 举报
回复
那说明你的数据只能达到这个压缩效果

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧