2013-07-30 29 views
23

Eğer os.urandom (64) diyorsam, 64 rasgele bayt veriyorum. Convert bytes to a Python string atıfla ben Python urandom'unu bir dizeye nasıl dönüştürebilirim?

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

çalıştı ama bayt utf-8 olmadıklarını belirten traceback hata var. Bayt

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' 

bazı dize gösterimi içine bu bayt kodunu çözmek için bir fullproof yöntem var mı ile

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 

? Birden çok veritabanı motorunda ilgili belgeleri takip etmek için sudo rasgele belirteçleri üretiyorum.

+0

Tek yolu ... ? Ya da 'urandom' kullanmak yerine neden bir uuid4 veya benzeri kullanmıyorsunuz? –

+0

Bu, rastgele bir tohum üretmek için de kullanılabilir mi? – Pinocchio

+0

Django'lar rastgele bir dizi mantığı oluşturur. https://github.com/django/django/blob/master/django/utils/crypto.py#L51 – bgth

cevap

33

piton 3'te cevap sadece diğer kimlikler atıfta kendi kimliğini oluşturur daha "merkez" db yok ... Neden bunu yapmanın

from base64 import b64encode 
from os import urandom 

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

teşekkürler, python 2.7 de çalışıyor! –

7

Rastgele baytlarınız var; Bir dizeye çözülebilirse çok şaşırırım.

Eğer sahip varsa

Latince-1'den, decode unicode dizesi var:

a.decode('latin1') 

o eşler çünkü Unicode kod noktalarını karşılık gelen biri-bir bayt.

+0

Her zaman işe yarıyor. Sadece django char alanının kabul edeceği bir diziye ihtiyacım var. – user1876508

+0

Evet; Django, yaklaşan 1.6 sürümünde sadece bir ikili alan ekledi. –

15

Temel 64 kodlamasını kullanabilirsiniz. Bu durumda:

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

Ayrıca ben unicode içine belirtmek hangi formatta olursa olsun onu almaya çalışıyor decode olarak yerine decode daha burada encode kullanıyorum unutmayın. Örneğinizde, rasgele baytları, geçerli bir utf-8 dizesi oluşturuyormuş gibi işleme tabi tutuyorsunuz; bu, nadiren rastgele baytlarda durum böyle olacak.

+2

'Bayt' nesnesinin özniteliği kodlamadığını belirten bir hata verdim. Bu kod, python'un bazı sürümleriyle ilgili mi? 3.3 – user1876508

+1

kullanıyorum python3.x hakkında emin değilim. Python2.7 kullanıyorum –

+0

@ user1876508 'str (b'hello ', kodlama)' kullanarak denediniz mi? Kodlama olarak 'base-64' ile çalışabilir. –

İlgili konular