Warum muss ich " b " kodiert einen string mit Base64?
Folgenden python-Beispiel, ich konvertieren einen string mit Base64:
>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
Aber, wenn ich verlassen sich die führenden b
:
>>> encoded = base64.b64encode('data to be encoded')
Bekomme ich die 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 so?
- Eigentlich alle Fragen, die Rückkehr "TypeError: expected bytes, nicht str" haben die gleiche Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
base64-Kodierung nimmt 8-bit-Binär-byte-Daten und kodiert Sie verwendet nur die Zeichen
A-Z
,a-z
,0-9
,+
,/
* so kann es übertragen werden, über Kanäle, die nicht erhalten alle 8-bit-Daten, wie E-Mail.Daher, will Sie eine Zeichenfolge von 8-bit-bytes. Sie erstellen diese in Python 3 mit der
b''
syntax.Wenn Sie entfernen die
b
wird, wird es ein string. Eine Zeichenkette ist eine Folge von Unicode-Zeichen. base64 hat keine Ahnung, was zu tun mit Unicode-Daten, es ist nicht 8-bit. Es ist nicht wirklich alle bits, in der Tat. 🙂In Ihrem zweiten Beispiel:
Alle Charaktere passen perfekt in den ASCII-Zeichensatz, und die base64-Codierung ist daher eigentlich ein bisschen sinnlos. Sie können es zu konvertieren in ascii statt, mit
Oder einfacher:
Wäre die gleiche Sache in diesem Fall.
* Bei den meisten base64-Aromen können auch eine
=
am Ende als Polsterung. In einigen base64-Varianten verwenden möglicherweise andere Zeichen als+
und/
. Finden Sie die Varianten übersichtstabelle bei Wikipedia eine übersicht.Kurze Antwort
Müssen Sie drücken Sie eine
bytes-like
Objekt (bytes
,bytearray
, etc), um diebase64.b64encode()
Methode. Hier sind zwei Möglichkeiten:Oder mit einer Variablen:
Warum?
In Python 3,
str
Objekte sind nicht C-style Charakter-arrays (Sie sind also nicht byte-arrays), sondern es sind Daten-Strukturen, die nicht irgendwelche inhärenten Codierung. Kodieren Sie die Zeichenfolge (oder interpretieren) in einer Vielzahl von Möglichkeiten. Der häufigste (und Standard in Python 3) ist utf-8, vor allem, da es rückwärts kompatibel mit ASCII (obwohl, da sind die meisten weit verbreiteten Codierungen). Das ist das, was passiert, wenn Sie einestring
aus und rufen Sie den.encode()
Methode: Python ist die Interpretation der string in utf-8 (Standard-Codierung) und das array von bytes, entspricht.Base-64 Encoding in Python 3
Ursprünglich der Frage-Titel gefragt Base-64-Codierung. Lesen Sie weiter für Base-64-stuff.
base64
Codierung dauert 6-bit-Binär-Blöcken und codiert Sie mit den Zeichen A-Z, a-z, 0-9, '+', '/', und '=' (einige Codierungen verwenden unterschiedlicher Zeichen anstelle von '+' und '/'). Dies ist ein Zeichensatz, der, basierend auf dem mathematischen Konstrukt der radix-64-oder base-64-Zahl-system, aber Sie sind sehr unterschiedlich. Base-64-in der Mathematik ist eine Zahl, die system wie dem Binär-oder dezimal -, und Sie machen diese änderung des radix auf die gesamte Zahl, oder (wenn das radix, das Sie konvertieren von eine Potenz von 2, die weniger als 64) in Blöcken von rechts nach Links.In
base64
Codierung, die übersetzung erfolgt von Links nach rechts; die ersten 64 Zeichen sind, warum es heißtbase64
Codierung. Der 65 - ' = ' - symbol wird verwendet für die Polsterung, da die Kodierung zieht 6-bit-Blöcken, aber die Daten, die es in der Regel bedeutete, zu Kodieren, sind 8-bit-bytes, so gibt es manchmal nur zwei oder 4 bits in der letzten chunk.Beispiel:
Wenn Sie interpretieren, dass die binären Daten als eine einzelne ganze Zahl, dann ist dies, wie würden Sie es konvertieren zu Basis 10 und Basis-64 (Tabelle für base-64 -):
base64
Codierung, allerdings wird der re-Gruppe diese Daten wie folgt:So, 'B0ZXN0" ist die base-64-version von unserem binäre, mathematisch gesprochen. Allerdings
base64
Codierung zu tun hat, die Codierung in die entgegengesetzte Richtung (also die raw-Daten konvertiert 'dGVzdA') und hat auch in der Regel zu sagen, andere Anwendungen wie viel Platz ist Links off am Ende. Dies geschieht durch die Polsterung am Ende mit ' = ' - Zeichen. So, diebase64
Codierung dieser Daten ist 'dGVzdA==', mit zwei '=' Zeichen zu bedeuten, die zwei Paare von bits benötigen, um entfernt werden, wenn diese Daten wird dekodiert, um ihn an den original-Daten.Let ' s test zu sehen, wenn ich unehrlich:
Warum
base64
Codierung?Sagen wir, ich habe, um Daten zu senden, um jemanden per E-Mail, wie diese Daten:
Gibt es zwei Probleme, die ich gepflanzt:
\x04
Zeichen gelesen wurde, denn das ist ASCII fürEND-OF-TRANSMISSION
(Strg-D), so werden die übrigen Daten werden aus der übertragung.BACKSPACE
Zeichen und dreiSPACE
Zeichen zu löschen, die 'msg'. So, auch wenn ich nicht dieEOF
Charakter es dem Endbenutzer nicht in der Lage zu übersetzen, von der der text auf dem Bildschirm, um die real, raw-Daten.Dies ist nur eine demo, Ihnen zu zeigen, wie schwer es sein kann, senden Sie einfach die raw Daten. Die Codierung der Daten in das base64-format erhalten Sie genau die gleichen Daten, aber in einem format, das sorgt sicher für den Versand über elektronische Medien wie E-Mail.
base64.b64encode(s.encode()).decode()
ist nicht sehr pythonic, wenn alle Sie wollen, ist ein string-zu-string-Konvertierung.base64.encode(s)
genug sein sollte, mindestens in Python ist3. Vielen Dank für eine sehr gute Erklärung über strings und bytes in pythonbase64.encode(s)
würde nicht funktionieren in Python ist3; Sie sagen, dass so etwas verfügbar sein sollte? Ich denke, der Grund, es könnte verwirrend sein, ist, dass, abhängig von der Codierung und der Inhalt der Zeichenfolges
vielleicht nicht 1 eindeutige Darstellung als array von bytes.Wenn die kodierten Daten enthält, die "exotischen" Zeichen, ich denken, Sie haben zu Kodieren, in "UTF-8"
Wenn der string Unicode ist der einfachste Weg ist:
Gibt es alles was Sie brauchen:
Den führenden
b
macht Ihren string binären.Welche Python version nutzt du? 2.x oder 3.x?
Edit: Sehen 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
Dass b bedeutet einfach, Sie sind unter input als Byte oder Byte-array und nicht als string.