2010-12-24 33 views
26

Python 2.x có chr(), chuyển đổi một số trong khoảng 0-255 thành chuỗi byte với một ký tự có giá trị số đó và unichr(). trong phạm vi 0-0x10FFFF đến một chuỗi Unicode với một ký tự với mã Unicode đó. Python 3.x thay thế unichr() với chr(), phù hợp với chính sách "Chuỗi Unicode là mặc định", nhưng tôi không thể tìm thấy bất cứ điều gì làm chính xác những gì cũ chr() đã làm. Tiện ích 2to3 (từ 2.6) lá chr cuộc gọi một mình, đó là không đúng nói chung :(chr() tương đương trả về đối tượng byte, trong py3k

(Đây là để phân tích và serializing một định dạng tập tin được định nghĩa một cách rõ ràng về byte 8-bit.)

Trả lời

8

Xem xét sử dụng bytearray ((255,)) mà hoạt động giống trong Py thon2 và Python3. Trong cả hai thế hệ Python kết quả bytearray-object có thể được chuyển đổi thành một byte (obj) là một bí danh cho một str() trong Python2 và byte thực() trong Python3.

# Python2 
>>> x = bytearray((32,33)) 
>>> x 
bytearray(b' !') 
>>> bytes(x) 
' !' 

# Python3 
>>> x = bytearray((32,33)) 
>>> x 
bytearray(b' !') 
>>> bytes(x) 
b' !' 
26

Hãy thử như sau:

b = bytes([x]) 

Ví dụ:

>>> bytes([255]) 
b'\xff' 
+0

tôi nhận được một chút bối rối về ném xung quanh mảng đầu nhưng có lẽ tôi không nên. Nó làm công việc, anyway. – zwol

+2

@Zack: Bạn có thể sử dụng '' byte ((255,)) '' làm biến thể. – malthe

+6

bytes ((255,)) trong Python2 sẽ KHÔNG cung cấp cho bạn b '\ xff' ... nó trả về '(255,)' để thay thế. –

5
>>> import struct 
>>> struct.pack('B', 10) 
b'\n' 
>>> import functools 
>>> bchr = functools.partial(struct.pack, 'B') 
>>> bchr(10) 
b'\n' 
4

Trong trường hợp bạn muốn viết Python 2/3 mã tương thích, sử dụng six.int2byte

+0

Tôi không hiểu tại sao điều đó sẽ tốt hơn câu trả lời của Guido, đặc biệt nếu tôi không có nhu cầu nào khác về 'sáu'. – zwol

+0

@zwol: Đối với Python 3.2+, 'int2byte = operator.methodcaller (" to_bytes ", 1," big ")'. Theo nhận xét, đây là khoảng 2x nhanh hơn 'byte ((...))'. Dù sao, 'int2byte (x)' trông đẹp hơn 'byte (bytearray ((x,)))' cho tôi. – zhangyoufu

+0

Tốc độ là tốt, nhưng trong điều gây ra câu hỏi ban đầu, * không phụ thuộc bên ngoài thư viện chuẩn * là một mối quan tâm trọng yếu. – zwol

Các vấn đề liên quan