2013-07-30 12 views
23

Se chiamo os.urandom (64), mi vengono dati 64 byte casuali. Con riferimento alla Convert bytes to a Python string ho provatoCome posso convertire un python casuale in una stringa?

a = os.urandom(64) 
a.decode() 
a.decode("utf-8") 

ma ottenuto l'errore traceback affermando che i byte non sono in UTF-8.

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 0: invalid start byte 

con i byte

b'\x8bz\xaf$\xb6\x93q\xef\x94\x99$\x8c\x1eO\xeb\xed\x03O\xc6L%\xe70\xf9\xd8 
\xa4\xac\x01\xe1\xb5\x0bM#\x19\xea+\x81\xdc\xcb\xed7O\xec\xf5\\}\x029\x122 
\x8b\xbd\xa9\xca\xb2\x88\r+\x88\xf0\xeaE\x9c' 

Esiste un metodo Fullproof per decodificare questi byte in qualche rappresentazione di stringa? Sto generando token casuali sudo per tenere traccia dei documenti correlati su più motori di database.

+0

strano modo di farlo ... Perché non solo ha un db di più "centrale" che genera il proprio ID, che si riferisce agli altri ID ... ? Oppure, invece di usare 'urandom' - perché non usare uuid4 o simili? –

+0

Può essere usato anche per generare un seme casuale? – Pinocchio

+0

Django genera una logica di stringa casuale. https://github.com/django/django/blob/master/django/utils/crypto.py#L51 – bgth

risposta

33

In Python 3, la risposta è

from base64 import b64encode 
from os import urandom 

random_bytes = urandom(64) 
token = b64encode(random_bytes).decode('utf-8') 
+0

grazie, funziona anche su python 2.7! –

7

Hai byte casuali; Sarei molto sorpreso se fosse mai stato decodificabile con una stringa.

Se avete di avere una stringa unicode, decodificare dal latino-1:

a.decode('latin1') 

perché le mappe byte one-to-one per corrispondenti punti di codice Unicode.

+0

Sembra funzionare ogni volta. Ho solo bisogno di una stringa accettata dal campo char di django. – user1876508

+0

Sì; è un peccato che Django abbia aggiunto solo un campo binario nella prossima versione 1.6. –

15

È possibile utilizzare la codifica base 64. In questo caso:

a = os.urandom(64) 
a.encode('base-64') 

Si noti inoltre che sto usando encode qui piuttosto che decode, come decode sta cercando di prendere da qualsiasi formato specificato in unicode. Quindi, nel tuo esempio, stai trattando i byte casuali come se formassero una stringa utf-8 valida, che raramente si verifica con byte casuali.

+2

Viene visualizzato un errore che indica che l'oggetto 'byte' non ha codifica attributo. Questo codice è specifico con alcune versioni di Python? Sto usando 3.3 – user1876508

+1

Non sono sicuro di python3.x. Sto usando python2.7 –

+0

@ user1876508 hai provato a usare 'str (b'hello ', encoding)'? Potrebbe funzionare con 'base-64' come codifica. –

Problemi correlati