有什么方法可以将256字节“类MD5”字符串压缩成160字节或更少?

时间:2011-07-28 03:11:14

标签: java android compression

我打算发送这样一个字符串(256bytes):

633a88d35a0f8fd172bd21158a03a8bb17ddc0acc6edb8ae19a9dbd1aa855b75319e540910fb70cf7bb51d608219dd4b387623f94262705a9c2c19332240e2a6d696d4cb896abf0101afae1aeebf3d6299675e0e67904e7a544de9e3e65fb9def9b0b047fb57a0b742226d602d386d9e2fe176a88837eddd0c77d6911d386c2e

通过短信通过android,内容应该在1条消息内。

正如您所知,SMS的每条消息限制为160字节,我尝试在Java中使用gzip,然后使用Base 64对压缩的内容进行编码,但压缩率并不是很好。

由于压缩数据将通过SMS发送,因此应该有一种编码方法使压缩字符串“可传输”。

有什么想法吗?

感谢您的任何意见/解答!

5 个答案:

答案 0 :(得分:4)

如果转换为二进制,则从256个十六进制数字变为128个字节。然后使用(或修改)this thread中提到的技术之一转换为SMS的可接受字符集。 (该主题涉及定位JSON,但同样的想法可以应用于SMS。)

答案 1 :(得分:1)

你可以使用ascii85(PostScript使用的ASCII85版本) 压缩任何零字节序列。这是Python shell中的转换:

>>> a = b'633a88d35a0f8fd172bd21158a03a8bb17ddc0acc6edb8ae19a9dbd1aa855b75319e540910fb70cf7bb51d608219dd4b387623f94262705a9c2c19332240e2a6d696d4cb896abf0101afae1aeebf3d6299675e0e67904e7a544de9e3e65fb9def9b0b047fb57a0b742226d602d386d9e2fe176a88837eddd0c77d6911d386c2e'

>>> ascii85_encoded = base85_encode(hex_decode(a))
>>> repr(ascii85_encoded) 
b'@lfFp=q?\\AEkNV2M?Bfh(Yum.`pL:=)6)B<WeFZ"0qM>N&GpFmHaOl%Jf3B;3-HPB6=On;S1GO6,!b.bes=h/M/\'d+!O&XEm_:noR:fh9B95l7<))W;k$P[Uq67(nqcBH"66^8S/N@U=0B%)QLc=_W%!U9b*B7jf' 

>>> len(ascii85_encoded)
160

现在上面的代码基于Python:

https://code.google.com/p/python-mom/source/browse/mom/codec/base85.py

您可能希望根据需要将其移植到Java。

HTH。

答案 2 :(得分:0)

你做不到。原因是类似MD5的数据最大化了熵,因此gzip和朋友将很难获得接近50%的效率,即使他们这样做了,也会受到影响。

最佳的2:1压缩是:将每2个字符视为十六进制的字节,并将其转换为二进制字符。这将把尺寸缩小到1/2。但是,无法发送二进制数据,因此您必须对其进行base64编码,从而导致33%的增加。这让你大约170个字符。 “Base-128”编码无济于事,因为没有128个字符可以传输。

简而言之,您需要减少数据。毕竟,发送更少数据的最简单方法是减少数据:)

答案 3 :(得分:0)

这实际上取决于您尝试发送的确切数据类型。

如果您的数据中存在可预测的模式,您可以使用带有预定义符号字母的http://en.wikipedia.org/wiki/Huffman_coding来降低您的尺寸。

答案 4 :(得分:0)

该字符串是十六进制编码的。因此,它使用二进制消息的200%空间。

如果您使用的是base64编码,则会使用134%,即171个字符。还是有点太多了。

Base85 ,由我的一位亲戚发明,可以做到。它将使用正好160个字符。