Любой способ сжать 256-байтовую "MD5-подобную" строку в 160 байтов или меньше? - PullRequest
0 голосов
/ 28 июля 2011

Я намереваюсь отправить такую ​​строку (256 байт):

633a88d35a0f8fd172bd21158a03a8bb17ddc0acc6edb8ae19a9dbd1aa855b75319e540910fb70cf7bb51d608219dd4b387623f94262705a9c2c19332240e2a6d696d4cb896abf0101afae1aeebf3d6299675e0e67904e7a544de9e3e65fb9def9b0b047fb57a0b742226d602d386d9e2fe176a88837eddd0c77d6911d386c2e

через SMS через Android, и содержимое должно быть в пределах 1 сообщения.

Как вы, возможно, знаете, SMS имеет ограничение в 160 байт на сообщение, я пытался использовать gzip в Java, а затем кодировать сжатые данные с помощью Base 64, но степень сжатия не очень хорошая.

Поскольку сжатые данные будут отправлены с помощью SMS, необходимо использовать метод кодирования, чтобы сделать сжатую строку «передаваемой».

Есть идеи?

Спасибо за любые комментарии /ответы!

Ответы [ 5 ]

4 голосов
/ 28 июля 2011

Если вы преобразуете в двоичный файл, вы переходите с 256 шестнадцатеричных цифр на 128 байтов.Затем используйте (или измените) один из методов, упомянутых в этой теме , чтобы преобразовать в приемлемый набор символов для SMS.(Этот поток имеет дело с таргетингом на JSON, но те же идеи могут быть применены к SMS.)

1 голос
/ 12 августа 2011

Вы можете использовать ascii85 (версия ASCII85, используемая PostScript), потому что это также сжимает любые последовательности нулевых байтов.Вот преобразование в оболочке Python:

>>> 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.

0 голосов
/ 28 июля 2011

Эта строка в шестнадцатеричном коде.Поэтому он использует 200% пространства двоичного сообщения.

Если бы вы использовали вместо этого кодировку base64, она бы использовала 134%, что составляет 171 символ.Все еще слишком много.

Base85 , который был изобретен моим родственником, мог бы сделать это.Это будет использовать ровно 160 символов.

0 голосов
/ 28 июля 2011

Это действительно зависит от точного типа данных, которые вы пытаетесь отправить.

Если в ваших данных есть предсказуемые шаблоны, вы, вероятно, можете использовать http://en.wikipedia.org/wiki/Huffman_coding с заранее заданным алфавитом символов, чтобы уменьшить ваш размер.

0 голосов
/ 28 июля 2011

Вы не можете этого сделать.Причина в том, что данные, подобные MD5, максимизируют энтропию, и поэтому gzip и друзьям будет трудно приблизиться к 50% эффективности, и даже если они это сделают, это будет удар или промах.

Оптимальный 2: 1 сжатие: обрабатывать каждые 2 символа как байт в шестнадцатеричном виде и преобразовывать его в двоичный символ.Это уменьшит размер до 1/2.Тем не менее, двоичные данные не могут быть отправлены, поэтому вам нужно кодировать их base64, что приводит к увеличению на 33%.Это оставляет вам около 170 символов.Кодирование «Base-128» не поможет, так как нет 128 символов, которые обязательно передадут.

Короче говоря, вам нужно сократить данные.В конце концов, самый простой способ отправить меньше данных - это иметь меньше данных:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...