Кодирование 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 выполняется быстрее, если мы знаем, что делаем на самом деле.

Другие вопросы по тегам