Следуя этому примеру с Python , я кодирую строку как Base64 с помощью:
>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Но если я пропущу ведущие b
:
>>> encoded = base64.b64encode('data to be encoded')
Я получаю следующую ошибку:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python32\lib\base64.py", line 56, in b64encode
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str
Почему это?
python
python-3.x
base64
dublintech
источник
источник
Ответы:
кодирование base64 занимает 8-битовые двоичные данные байт и кодируют его использует только символы
A-Z
,a-z
,0-9
,+
,/
* так что он может быть передан по каналам , которые не сохраняют все 8 бит данных, такие как электронная почта.Следовательно, он хочет строку из 8-битных байтов. Вы создаете те в Python 3 с
b''
синтаксисом.Если вы удалите
b
, он станет строкой. Строка - это последовательность символов Юникода. Base64 понятия не имеет, что делать с данными Unicode, это не 8-битный код. На самом деле это не какие-то биты. :-)В вашем втором примере:
Все символы аккуратно вписываются в набор символов ASCII, и поэтому кодирование base64 на самом деле немного бессмысленно. Вы можете преобразовать его в ASCII вместо
Или проще:
Что было бы то же самое в этом случае.
* Большинство base64-ароматов могут также включать
=
в конце как отступ. Кроме того, некоторые варианты base64 могут использовать символы, отличные от+
и/
. Смотрите сводную таблицу вариантов в Википедии для обзора.источник
Короткий ответ
Вам нужно вставить
bytes-like
объект (bytes
,bytearray
и т. Д.) Вbase64.b64encode()
метод. Вот два способа:Или с переменной:
Зачем?
В Python 3
str
объекты не являются символьными массивами в стиле C (поэтому они не являются байтовыми массивами), а скорее являются структурами данных, которые не имеют встроенной кодировки. Вы можете закодировать эту строку (или интерпретировать ее) различными способами. Наиболее распространенным (и по умолчанию в Python 3) является utf-8, тем более что он обратно совместим с ASCII (хотя, как и наиболее широко используемые кодировки). Вот что происходит, когда вы берете astring
и вызываете.encode()
метод для него: Python интерпретирует строку в utf-8 (кодировка по умолчанию) и предоставляет вам массив байтов, которому она соответствует.Кодировка Base-64 в Python 3
Первоначально заголовок вопроса задавался о кодировке Base-64. Продолжайте читать для Base-64 вещи.
base64
кодирование берет 6-битные двоичные фрагменты и кодирует их, используя символы AZ, az, 0-9, '+', '/' и '=' (некоторые кодировки используют разные символы вместо '+' и '/') , Это кодировка символов, основанная на математической конструкции системы счисления radix-64 или base-64, но они очень разные. Base-64 в математике - это система счисления, такая как двоичная или десятичная, и вы делаете это изменение основ на всем числе, или (если основание, из которого вы производите преобразование, является степенью 2 меньше 64) в кусках справа налево осталось.В
base64
кодировке перевод выполняется слева направо; эти первые 64 символа - вот почему это называетсяbase64
кодированием . 65-й символ «=» используется для заполнения, поскольку кодирование извлекает 6-битные порции, но данные, которые обычно предназначены для кодирования, представляют собой 8-битные байты, поэтому иногда в последнем порции есть только два или 4 бита.Пример:
Если вы интерпретируете эти двоичные данные как одно целое число, то вы должны преобразовать их в base-10 и base-64 ( таблица для base-64 ):
base64
кодирование , однако, перегруппирует эти данные таким образом:Итак, «B0ZXN0» - это версия нашего бинарного кода с точки зрения математики, основанная на 64. Однако
base64
кодирование должно выполнять кодирование в противоположном направлении (поэтому необработанные данные преобразуются в «dGVzdA»), а также имеет правило, чтобы сообщать другим приложениям, сколько места осталось в конце. Это делается путем заполнения конца символами '='. Таким образом,base64
кодировка этих данных - «dGVzdA ==», с двумя символами «=» для обозначения двух пар битов необходимо будет удалить с конца, когда эти данные будут декодированы, чтобы они соответствовали исходным данным.Давайте проверим это, чтобы убедиться, что я нечестен:
Зачем использовать
base64
кодировку?Допустим, мне нужно отправить данные кому-нибудь по электронной почте, например:
Я поставил две проблемы:
\x04
будет прочитан символ, потому что это ASCII дляEND-OF-TRANSMISSION
(Ctrl-D), поэтому оставшиеся данные будут исключены из передачи.BACKSPACE
символа и триSPACE
символа, чтобы стереть «MSG». Таким образом, даже если бы у меня не былоEOF
персонажа, конечный пользователь не смог бы перевести текст с экрана на реальные необработанные данные.Это просто демонстрация, чтобы показать вам, как трудно просто отправлять необработанные данные. Кодирование данных в формате base64 дает вам точно такие же данные, но в формате, который обеспечивает их безопасную отправку через электронные носители, такие как электронная почта.
источник
base64.b64encode(s.encode()).decode()
не очень питоничен, когда все, что вам нужно, это преобразование строки в строку.base64.encode(s)
должно быть достаточно хотя бы в python3. Спасибо за очень хорошее объяснение о строках и байтах в pythonbase64.encode(s)
не будет работать в Python3; Вы говорите, что нечто подобное должно быть доступно? Я думаю, причина, по которой это может сбить с толку, заключается в том, что в зависимости от кодировки и содержимого строкиs
может не иметь 1 уникальное представление в виде массива байтов.Если данные для кодирования содержат «экзотические» символы, я думаю, что вы должны кодировать в «UTF-8»
источник
Если строка является Unicode, самый простой способ:
источник
Есть все, что вам нужно:
Ведущий
b
делает вашу строку двоичной.Какую версию Python вы используете? 2.x или 3.x?
Изменить: см. Http://docs.python.org/release/3.0.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit для подробного описания строк в Python 3.x
источник
Это просто означает, что вы воспринимаете ввод как байты или байты, а не как строки.
источник