2013-09-04 25 views
9

Sto cercando di codificare un int a Base64, che sto facendo che:Come codificare intero a stringa base64 in Python 3

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

risultato atteso:'MQ=='

dato output:b'AA=='

cosa sto facendo di sbagliato?

Edit: in Python 2.7.2 funziona correttamente

Grazie!

+1

Hmm ... quale versione di Python stai usando? Quando eseguo base64.b64encode (byte (1)) o foo = 1; base64.b64encode (byte (pippo)) Sto ricevendo 'MQ =='. Inoltre, dove stai eseguendo questo? – Foon

+1

Quando eseguo il codice, ho l'output previsto. Hai ridefinito foo da qualche altra parte? prova base64.b64encode (b'1 ') –

+0

sto usando Python 3.3.2 – fj123x

risposta

3

Prova questo:

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

o

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

Il primo esempio codifica l'intero 1 byte 1. Il secondo esempio codifica la stringa di caratteri da 1 byte '1'.

+0

questo sta restituendo 'AQ ==' invece di 'MQ ==' – fj123x

+0

Il 2o esempio restituisce 'MQ =='. –

+1

Per gli altri che desiderano codificare numeri interi ma non hanno un risultato previsto: funziona, ma la stringa codificata può essere molto più lunga del necessario. Questo perché convertendo i numeri in stringhe, stai usando solo una piccola parte dello spazio di input, ma b64encode non lo sa (per esempio, non sa che non ci sarà mai una lettera). Penso che sia meglio usare il modulo 'struct' per fare' b64encode (pack (' Mark

8

Se si inizializza byte (N) con un intero N, che vi darà byte di lunghezza N inizializzate con byte nulli:

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

ciò che si vuole è la stringa "1"; quindi codificare per byte con:

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

ora, Base64 vi darà b'MQ==':

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

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

Problemi correlati