Кодирование base64 против травления объектов Python
Я не использовал много засолки и кодирования с Python. Но, как только я узнал о них, я подумал, что могу выполнить ту же самую операцию преобразования объекта Python в строку, используя два разных способа.
# 1: Использование модуля соления
>>> encoded = pickle.dumps(range(10))
>>> pickle.loads(encoded)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#2: Использование кодировки Base64
# First I'l define encode and decode functions for convenience.
def encode(obj):
string = json.dumps(obj)
return base64.b64encode(string)
def decode(string):
decoded_string = base64.b64decode(string)
return json.loads(decoded_string)
# Encode and Decode.
>>> encoded = encode(range(10))
>>> decode(encoded)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
base64
Каковы их типичные варианты использования и какой метод более эффективен в своей работе?
ОБНОВИТЬ:
Теперь я понимаю, что мой вопрос не имеет особого смысла. Сравнение json
а также pickle
будет лучше вопрос. Кодирование Base64 может быть выполнено как для json, так и для консервированных строк, и используется для создания кодировки только ASCII-строк; пример: для передачи данных в качестве параметра GET в URL.
1 ответ
Base64 - это способ кодирования двоичных данных в печатаемую строку. В байте имеется 256 возможных значений (8 бит), и менее половины из них являются печатными символами. У вас есть, например, строка вниз (0xa), возврат каретки (0xc), нулевой терминатор (0x0) и так далее. Когда текстовые протоколы (а именно SMTP) обнаружили необходимость передачи двоичных данных - возникла необходимость кодировать эти данные в текстовый формат. Это кодировка Base64 или MIME. Вы используете 64 печатных символа (6 бит) для кодирования всех двоичных данных - это означает, что вы раздули свои данные на 33%. Это очень неэффективно, но работает.
Pickle - это способ Pythons для сериализации (процесс преобразования объектов времени выполнения в объекты потока битов) своих объектов. Я бы доверял инженерам, которые разработали систему, чтобы сделать ее относительно эффективной.
Base64 не был предназначен для этого. Base64 - просто неэффективный способ хранения двоичных данных.
Pickle имеет много преимуществ и возможностей по сравнению с base64.
например:
class A:
"""class def here"""
pass
a = A()
apick = pickle.dumps(a)
print(apick)
# this scenario even works when apick is send to a different python instance where A is **not** defined
b = pickle.loads(apick)
но, на мой взгляд, отправка байтовой строки с использованием base64 выполняется быстрее, если мы знаем, что делаем на самом деле.