У вас будет , у вас есть, чтобы выразить свои данные, используя только ASCII-символы. Использование Base64 - наиболее эффективный метод (доступный в стандартной библиотеке Python), чтобы сделать это с точки зрения обеспечения того, чтобы двоичные данные соответствовали печатаемому тексту, который также безопасен для UTF-8. Конечно, для того, чтобы выражать одни и те же данные, требуется 33% пространства, но другие методы принимают больше дополнительное пространство.
Вы можете комбинировать это с сжатием, чтобы ограничить, сколько места это займет, но сделайте компрессию опциональной (отметьте данные) и только на самом деле используйте ее, если данные будут меньше.
import zlib
import base64
def pack_utf8_safe(data):
is_compressed = False
compressed = zlib.compress(data)
if len(compressed) < (len(data) - 1):
data = compressed
is_compressed = True
base64_encoded = base64.b64encode(data)
if is_compressed:
base64_encoded = '.' + base64_encoded
return base64_encoded
def unpack_utf8_safe(base64_encoded):
decompress = False
if base64_encoded.startswith('.'):
base64_encoded = base64_encoded[1:]
decompress = True
data = base64.b64decode(base64_encoded)
if decompress:
data = zlib.decompress(data)
return data
'.'
символ не является частью алфавита Base64, так что я использовал его здесь, чтобы отметить сжатые данные.
Вы можете дополнительно побрить 1 или 2 =
отступы заполнения с конца кодированных данных Base64; они могут быть снова добавлены при декодировании (добавьте '=' * (-len(encoded) * 4)
до конца), но я не уверен, что это стоит того.
Вы можете добиться дополнительной экономии за счет переключения на Base85 encoding, кодирование ASCII с 4 по 5 для двоичных данных, поэтому накладные расходы 20%. Для Python 2.7 это доступно только во внешней библиотеке (Python 3.4 added it to the base64
library). Вы можете использовать python-mom
project в 2.7:
from mom.codec import base85
и заменить все base64.b64encode()
и base64.b64decode()
звонки с base85.b85encode()
и base85.b85decode()
звонков вместо этого.
Если вы 100% уверены, ничего по пути не будет рассматривать ваши данные как текст (возможно, изменяющих разделители строк, или интерпретировать и изменить другие управляющие коды), можно также использовать кодировку Base128, уменьшая накладные расходы до 14,3% (8 символов за каждые 7 байтов). Однако я не могу рекомендовать для вас модуль Python, устанавливаемый для установки; есть GitHub hosted module, но я его не тестировал.
Вопрос на полях: Python 2 или 3? –
[Что вы намерены делать с этими байтами?] (Http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –
@SylvainLeroux Это 2,7 –