Kurze Antwort
Sie benötigen ein schieben bytes-like
Objekt ( bytes
, bytearray
usw.) an die base64.b64encode()
Methode. Hier sind zwei Möglichkeiten:
>>> data = base64.b64encode(b'data to be encoded')
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Oder mit einer Variablen:
>>> string = 'data to be encoded'
>>> data = base64.b64encode(string.encode())
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'
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 nehmen string
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 als base64
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:
>>> data = b'test'
>>> for byte in data:
... print(format(byte, '08b'), end=" ")
...
01110100 01100101 01110011 01110100
>>>
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 ):
base-2: 01 110100 011001 010111 001101 110100 (base-64 grouping shown)
base-10: 1952805748
base-64: B 0 Z X N 0
base64
Durch die Codierung werden diese Daten jedoch folgendermaßen neu gruppiert:
base-2: 011101 000110 010101 110011 011101 00(0000) <- pad w/zeros to make a clean 6-bit chunk
base-10: 29 6 21 51 29 0
base-64: d G V z d A
'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. Die base64
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:
>>> encoded = base64.b64encode(data)
>>> print(encoded)
b'dGVzdA=='
Warum base64
Codierung verwenden?
Angenommen, ich muss einige Daten per E-Mail an jemanden senden, wie diese Daten:
>>> data = b'\x04\x6d\x73\x67\x08\x08\x08\x20\x20\x20'
>>> print(data.decode())
>>> print(data)
b'\x04msg\x08\x08\x08 '
>>>
Ich habe zwei Probleme gepflanzt:
- Wenn ich versuchen würde, diese E-Mail unter Unix zu senden, wird die E-Mail gesendet, sobald das
\x04
Zeichen gelesen wurde, da dies ASCII für END-OF-TRANSMISSION
(Strg-D) ist, sodass die verbleibenden Daten von der Übertragung ausgeschlossen werden.
- Auch wenn Python klug genug ist, um all meinen bösen Steuerzeichen zu entgehen, wenn ich die Daten direkt drucke, können Sie beim Dekodieren dieser Zeichenfolge als ASCII feststellen, dass die 'msg' nicht vorhanden ist. Das liegt daran, dass ich drei
BACKSPACE
Zeichen und drei SPACE
Zeichen verwendet habe, um die 'Nachricht' zu löschen. Selbst wenn ich den EOF
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.