2013-09-04 7 views
1

У меня есть 32 байта двоичных данных, которые я хочу кодировать. Он будет помещен в URL-адрес, поэтому предпочтительный URL-адрес предпочтительнее. Очевидно, что типичная кодировка выбора - это hex. В результате получается строка из 64 символов.Самая короткая кодировка для 32 байтов данных

Я провожу много времени, смотря на различных кодировках, и был интересно, после неудачной попытки найти, если есть некоторые кодировки, которые могут производить вывод менее 64 символов, но без дополнения (только для чистоты URL, Я бы предпочел не иметь отступы). Правильный вариант будет чем-то вроде версии Base 64, которая автоматически определяет, когда декодирование возвращается к двоичному, необходимо ли заполнение.

Похоже, что Base 64 должен быть в состоянии определить, какое количество заполняемых элементов было без символов «=», поскольку вы можете добавить произвольное число символов «=» в конец строки базы 64 и он всегда будет успешно декодироваться (по крайней мере, используя Python's base64.b64decode()). Я мог бы вручную разбить и снова добавить прописку в кодированные строки с базой 64, но для моего варианта использования это будет много дополнительных манипуляций с строкой.

+0

Если вы действительно обеспокоены производительности (не преждевременно оптимизировать) самое лучшее решение, вероятно, чтобы написать свой собственный кодировщик Base64, что оставляет от отступы, и написать декодер, который использует таблицу поиска (это на самом деле не так сложно). По собственному опыту большинство кодировщиков/декодеров, которые включены в языки или библиотеки кодирования, не оптимизированы для скорости (я не могу говорить напрямую с python, хотя). – Syon

+0

@Syon это очень поздняя оптимизация этапа. Мы публикуем внутренний API, который используется несколькими платформами в течение года, для общественности. Написание нашего собственного кодировщика/декодера Base 64 определенно является опцией. Может даже записать его в C и скомпилировать его как Python lib. – Endophage

ответ

2

Батареи прилагаются.

>>> import base64 
>>> b64decode_autopadded = lambda b: base64.urlsafe_b64decode(b + '=='[:3 - len(b)%3]) 
>>> base64.urlsafe_b64encode("somedatastring\0\1").rstrip('=') 
'c29tZWRhdGFzdHJpbmcAAQ' 
>>> b64decode_autopadded("c29tZWRhdGFzdHJpbmcAAQ") 
'somedatastring\x00\x01' 
+0

base64.urlsafe_b64encode ("somedatastring1 \ 0") == 'c29tZWRhdGFzdHJpbmcxAA ==' 'Попытка избежать заполнения ==. – Endophage

+0

См. Обновленный ответ. – jhermann

+0

Читайте внимательно. Я упоминаю это решение, но у меня есть много байтовых двоичных файлов размером 32 байта, которые являются независимыми, поэтому я бы снял/добавил заполнение тысяч, даже миллионы раз в минуту. – Endophage