Nach diesem Python-Beispiel codiere ich einen String als Base64 mit:
>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Aber wenn ich die Führung weglasse b
:
>>> encoded = base64.b64encode('data to be encoded')
Ich erhalte folgende Fehlermeldung:
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
Warum ist das?
python
python-3.x
base64
dublintech
quelle
quelle
Antworten:
Base64 - Kodierung nimmt 8-Bit - Binär - Byte - Daten und codiert sie verwendet nur die Zeichen
A-Z
,a-z
,0-9
,+
,/
* so kann es über Kanäle übertragen werden , die nicht alle 8 Bits von Daten werden erhalten, wie beispielsweise E - Mail.Daher wird eine Zeichenfolge von 8-Bit-Bytes benötigt. Sie erstellen diese in Python 3 mit der
b''
Syntax.Wenn Sie das entfernen
b
, wird es eine Zeichenfolge. Eine Zeichenfolge ist eine Folge von Unicode-Zeichen. base64 hat keine Ahnung, was mit Unicode-Daten zu tun ist, es ist kein 8-Bit. Es sind eigentlich keine Kleinigkeiten. :-)In Ihrem zweiten Beispiel:
Alle Zeichen passen genau in den ASCII-Zeichensatz, und die Base64-Codierung ist daher eigentlich etwas sinnlos. Sie können es stattdessen in ASCII konvertieren, mit
Oder einfacher:
Welches wäre das gleiche in diesem Fall.
* Die meisten Base64-Aromen können auch ein
=
am Ende als Polsterung enthalten. Darüber hinaus können einige base64-Varianten andere Zeichen als+
und verwenden/
. Eine Übersicht finden Sie in der Variantenübersichtstabelle bei Wikipedia.quelle
Kurze Antwort
Sie benötigen ein schieben
bytes-like
Objekt (bytes
,bytearray
usw.) an diebase64.b64encode()
Methode. Hier sind zwei Möglichkeiten:Oder mit einer Variablen:
Warum?
In Python 3 sind
str
Objekte keine Zeichenarrays im C-Stil (es handelt sich also nicht um Byte-Arrays), sondern Datenstrukturen ohne inhärente Codierung. Sie können diese Zeichenfolge auf verschiedene Arten codieren (oder interpretieren). Am häufigsten (und standardmäßig in Python 3) ist utf-8, insbesondere da es abwärtskompatibel mit ASCII ist (obwohl dies die am häufigsten verwendeten Codierungen sind). Das passiert, wenn Sie a nehmenstring
und die.encode()
Methode darauf aufrufen : Python interpretiert die Zeichenfolge in utf-8 (der Standardcodierung) und stellt Ihnen das Array von Bytes zur Verfügung, dem es entspricht.Base-64-Codierung in Python 3
Ursprünglich wurde der Fragentitel zur Base-64-Codierung gestellt. Lesen Sie weiter für Base-64-Sachen.
base64
Die Codierung verwendet 6-Bit-Binärblöcke und codiert sie mit den Zeichen AZ, az, 0-9, '+', '/' und '=' (einige Codierungen verwenden unterschiedliche Zeichen anstelle von '+' und '/'). . Dies ist eine Zeichenkodierung, die auf dem mathematischen Konstrukt des Radix-64- oder Basis-64-Zahlensystems basiert, aber sehr unterschiedlich ist. Base-64 in Mathe ist ein Zahlensystem wie binär oder dezimal, und Sie nehmen diese Änderung des Radix für die gesamte Zahl vor oder (wenn der Radix, von dem Sie konvertieren, eine Potenz von 2 weniger als 64 ist) in Blöcken von rechts nach links.Bei der
base64
Codierung erfolgt die Übersetzung von links nach rechts. Diese ersten 64 Zeichen sind der Grund, warum es alsbase64
Codierung bezeichnet wird . Das 65. '=' Symbol wird zum Auffüllen verwendet, da die Codierung 6-Bit-Chunks abruft, die Daten, die normalerweise codiert werden sollen, jedoch 8-Bit-Bytes sind, sodass der letzte Chunk manchmal nur zwei oder 4 Bits enthält.Beispiel:
Wenn Sie diese Binärdaten als einzelne Ganzzahl interpretieren, konvertieren Sie sie folgendermaßen in Base-10 und Base-64 ( Tabelle für Base-64 ):
base64
Durch die Codierung werden diese Daten jedoch folgendermaßen neu gruppiert:'B0ZXN0' ist also mathematisch gesehen die Base-64-Version unserer Binärdatei. Die
base64
Codierung muss jedoch in die entgegengesetzte Richtung codiert werden (damit die Rohdaten in 'dGVzdA' konvertiert werden) und hat auch die Regel, anderen Anwendungen mitzuteilen, wie viel Speicherplatz am Ende übrig bleibt. Dies erfolgt durch Auffüllen des Endes mit '=' Symbolen. Diebase64
Codierung dieser Daten lautet also 'dGVzdA ==', wobei zwei '=' Symbole zur Kennzeichnung von zwei Bitpaaren am Ende entfernt werden müssen, wenn diese Daten decodiert werden, damit sie mit den Originaldaten übereinstimmen.Lassen Sie uns dies testen, um zu sehen, ob ich unehrlich bin:
Warum
base64
Codierung verwenden?Angenommen, ich muss einige Daten per E-Mail an jemanden senden, wie diese Daten:
Ich habe zwei Probleme gepflanzt:
\x04
Zeichen gelesen wurde, da dies ASCII fürEND-OF-TRANSMISSION
(Strg-D) ist, sodass die verbleibenden Daten von der Übertragung ausgeschlossen werden.BACKSPACE
Zeichen und dreiSPACE
Zeichen verwendet habe, um die 'Nachricht' zu löschen. Selbst wenn ich denEOF
Charakter dort nicht hätte, wäre der Endbenutzer nicht in der Lage, vom Text auf dem Bildschirm in die realen Rohdaten zu übersetzen.Dies ist nur eine Demo, die Ihnen zeigt, wie schwierig es sein kann, Rohdaten einfach zu senden. Wenn Sie die Daten in das base64-Format codieren, erhalten Sie genau dieselben Daten, jedoch in einem Format, das sicherstellt, dass sie sicher über elektronische Medien wie E-Mail gesendet werden können.
quelle
base64.b64encode(s.encode()).decode()
ist nicht sehr pythonisch, wenn Sie nur eine Konvertierung von Zeichenfolge in Zeichenfolge wünschen.base64.encode(s)
sollte zumindest in python3 ausreichen. Vielen Dank für eine sehr gute Erklärung über Strings und Bytes in Pythonbase64.encode(s)
nicht in Python3 funktionieren; Wollen Sie damit sagen, dass so etwas verfügbar sein sollte? Ich denke, der Grund, warum es verwirrend sein könnte, ist, dass abhängig von der Codierung und dem Inhalt der Zeichenfolges
möglicherweise keine eindeutige Darstellung als Array von Bytes vorhanden ist.Wenn die zu codierenden Daten "exotische" Zeichen enthalten, müssen Sie sie in "UTF-8" codieren.
quelle
Wenn die Zeichenfolge Unicode ist, ist der einfachste Weg:
quelle
Es gibt alles was Sie brauchen:
Der führende
b
macht Ihren String binär.Welche Version von Python verwenden Sie? 2.x oder 3.x?
Edit: Siehe http://docs.python.org/release/3.0.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit für die blutigen Details von Strings in Python 3.x.
quelle
Das b bedeutet einfach, dass Sie die Eingabe als Bytes oder Bytes-Array und nicht als Zeichenfolge verwenden.
quelle