2013-09-04 27 views
9

Ich versuche, ein int in zu Base64 zu kodieren, mache ich das:Wie in zu base64 String integer kodieren, in Python 3

foo = 1 
base64.b64encode(bytes(foo)) 

erwartete Ausgabe:'MQ=='

gegebenen Ausgang:b'AA=='

was mache ich falsch?

Edit: in Python 2.7.2 funktioniert richtig

Dank!

+1

Hmm ..., welche Version von Python verwenden Sie? Wenn ich base64.b64encode (bytes (1)) oder foo = 1; base64.b64encode (bytes (foo)) mache, bekomme ich 'MQ =='. Wo rennst du das auch? – Foon

+1

Wenn ich Ihren Code ausführen, habe ich die erwartete Ausgabe. Hast du foo woanders neu definiert? versuche base64.b64encode (b'1 ') –

+0

ich benutze Python 3.3.2 – fj123x

Antwort

3

Dieses versuchen:

foo = 1 
base64.b64encode(bytes([foo])) 

oder

foo = 1 
base64.b64encode(bytes(str(foo), 'ascii')) 
# Or, roughly equivalently: 
base64.b64encode(str(foo).encode('ascii')) 

Das erste Beispiel codiert das 1-Byte-Ganzzahl 1. Das zweite Beispiel codiert die 1-Byte-Zeichenfolge '1'.

+0

Dies gibt 'AQ == 'anstelle von' MQ == ' – fj123x

+0

zurück Das zweite Beispiel gibt' MQ == 'zurück. –

+1

Für andere, die Integer codieren möchten, aber keine Ausgabe erwartet haben: Das funktioniert, aber die codierte Zeichenfolge kann viel länger als nötig sein. Das liegt daran, dass Sie bei der Umwandlung von Zahlen in Zeichenfolgen nur einen winzigen Bruchteil des Eingabefeldes verwenden, aber b64encode weiß nichts darüber (z. B. weiß es nicht, dass es niemals einen Buchstaben geben wird). Ich denke, es ist besser, das 'struct'-Modul zu verwenden, um 'b64encode (pack (' Mark

8

Wenn Sie Bytes (N) mit einer ganzen Zahl N initialisieren, wird es Ihnen Bytes der Länge N mit Null-Bytes initialisiert geben:

>>> bytes(10) 
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 

, was Sie wollen, ist die Zeichenfolge "1"; so codieren es zu Bytes mit:

>>> "1".encode() 
b'1' 

jetzt, base64 geben Ihnen b'MQ==':

>>> import base64 
>>> base64.b64encode("1".encode()) 
b'MQ==' 
+1

base64.b64encode (i.to_bytes (ceil (i.bit_length()/8), 'groß')) –