2013-07-30 41 views
23

Nếu tôi gọi os.urandom (64), tôi được cấp 64 byte ngẫu nhiên. Với tham chiếu đến Convert bytes to a Python string tôi đã cố gắngLàm thế nào tôi có thể chuyển đổi một urthon python thành một chuỗi?

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

nhưng đã nhận lỗi traceback nói rằng các byte không phải là trong 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 

với các 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' 

Có một phương pháp fullproof để giải mã các byte vào một số đại diện chuỗi? Tôi đang tạo các mã thông báo ngẫu nhiên sudo để theo dõi các tài liệu liên quan trên nhiều công cụ cơ sở dữ liệu.

+0

cách Odd để làm việc đó ... Tại sao không chỉ có một db nhiều "trung tâm" mà tạo ra ID riêng của mình, trong đó đề cập đến các ID khác ... ? Hoặc, thay vì dùng 'urandom' - tại sao không dùng uuid4 hay tương tự? –

+0

Điều này cũng có thể được sử dụng để tạo ra một hạt giống ngẫu nhiên? – Pinocchio

+0

Tạo chuỗi ký tự ngẫu nhiên của Django. https://github.com/django/django/blob/master/django/utils/crypto.py#L51 – bgth

Trả lời

33

Trong python 3, câu trả lời là

from base64 import b64encode 
from os import urandom 

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

cảm ơn, nó hoạt động trên trăn 2.7 quá! –

7

Bạn có byte ngẫu nhiên; Tôi sẽ rất ngạc nhiên nếu điều đó có thể được giải mã thành một chuỗi.

Nếu bạn để có một chuỗi unicode, giải mã từ Latin-1:

a.decode('latin1') 

vì nó maps byte one-on-one để tương ứng với các điểm mã Unicode.

+0

Dường như làm việc mọi lúc. Tôi chỉ cần một chuỗi mà lĩnh vực django char sẽ chấp nhận. – user1876508

+0

Có; nó là một điều đáng tiếc Django chỉ thêm một lĩnh vực nhị phân trong phiên bản 1.6 sắp tới. –

15

Bạn có thể sử dụng mã hóa base-64. Trong trường hợp này:

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

Cũng lưu ý rằng tôi đang sử dụng encode đây chứ không phải là decode, như decode đang cố gắng mang nó từ bất cứ định dạng mà bạn chỉ định vào unicode. Vì vậy, trong ví dụ của bạn, bạn đang xử lý các byte ngẫu nhiên như thể chúng tạo thành một chuỗi utf-8 hợp lệ, hiếm khi xảy ra với các byte ngẫu nhiên.

+2

Tôi nhận được thông báo lỗi rằng đối tượng 'byte' không mã hóa thuộc tính. Mã này có cụ thể với một số phiên bản của python không? Tôi đang sử dụng 3.3 – user1876508

+1

Tôi không chắc chắn về python3.x. Tôi đang sử dụng python2.7 –

+0

@ user1876508 bạn đã thử sử dụng 'str (b'hello ', encoding)'? Nó có thể làm việc với 'base-64' làm mã hóa của bạn. –