我打算发送这样一个字符串(256bytes):
633a88d35a0f8fd172bd21158a03a8bb17ddc0acc6edb8ae19a9dbd1aa855b75319e540910fb70cf7bb51d608219dd4b387623f94262705a9c2c19332240e2a6d696d4cb896abf0101afae1aeebf3d6299675e0e67904e7a544de9e3e65fb9def9b0b047fb57a0b742226d602d386d9e2fe176a88837eddd0c77d6911d386c2e
通过短信通过android,内容应该在1条消息内。
正如您所知,SMS的每条消息限制为160字节,我尝试在Java中使用gzip,然后使用Base 64对压缩的内容进行编码,但压缩率并不是很好。
由于压缩数据将通过SMS发送,因此应该有一种编码方法使压缩字符串“可传输”。
有什么想法吗?
感谢您的任何意见/解答!
答案 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个字符。