2013-09-04 30 views
9

Próbuję zakodować int do base64, robię to:Jak zakodować liczbę całkowitą w celu base64 ciąg w Pythonie 3

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

oczekiwany wynik:'MQ=='

podana wydajność:b'AA=='

co robię źle?

Edytuj: w Pythonie 2.7.2 działa poprawnie

Dzięki!

+1

Hmm ... co wersja Pythona używasz? Kiedy robię base64.b64encode (bytes (1)) lub foo = 1; base64.b64encode (bytes (foo)) otrzymuję "MQ ==". Ponadto, gdzie to uruchamiasz? – Foon

+1

Po uruchomieniu kodu mam oczekiwany wynik. Czy na nowo zdefiniowałeś foo? spróbuj base64.b64encode (b'1 ') –

+0

używam Pythona 3.3.2 – fj123x

Odpowiedz

3

Spróbuj:

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

lub

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

Pierwszy przykład koduje całkowitą 1-bajtowy 1. Drugi przykład koduje 1-bajtowy ciąg znaków '1'.

+0

powraca "AQ ==" zamiast 'MQ ==' – fj123x

+0

Drugi przykład zwraca 'MQ =='. –

+1

Dla innych, którzy chcą kodować liczby całkowite, ale nie mają oczekiwanych danych wyjściowych: To działa, ale zakodowany ciąg może być znacznie dłuższy niż potrzeba. Dzieje się tak dlatego, że konwertując liczby na łańcuchy, używasz tylko niewielkiej części przestrzeni wejściowej, ale b64 kodowanie nie wie o tym (np. Nie wie, że nigdy nie będzie litery). Myślę, że lepiej jest użyć modułu 'struct' do wykonania' b64 kodowania (pakiet (' Mark

8

Jeśli zainicjować bajtów (n) liczb całkowitych n, to daje bajtów długości N inicjowane bajtami null:

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

co chcesz jest łańcuch „1”; tak zakodować go bajtów z:

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

teraz, base64 daje b'MQ==':

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

base64.b64encode (i.to_bytes (ceil (i.bit_length()/8), "duże")) –