Tôi nghĩ rằng giải pháp tốt nhất là phải rõ ràng và nói rằng bạn muốn để đại diện cho một số như là một byte (và not as a character):
>>> import struct
>>> struct.pack('B', 128)
>>> '\x80'
Điều này làm cho việc mã của bạn trong cả Python 2 và Python 3 (trong Python 3, kết quả là, như nó phải, một đối tượng bytes). Một thay thế, bằng Python 3, sẽ được sử dụng mới bytes([128])
để tạo ra một byte đơn có giá trị 128.
Tôi không phải là một fan hâm mộ lớn của chr()
giải pháp: in Python 3, họ tạo ra một (nhân vật, chứ không phải byte) chuỗi cần phải là encoded trước khi gửi bất kỳ nơi nào (tệp, ổ cắm, thiết bị đầu cuối, ...) - chr()
bằng Python 3 tương đương với vấn đề Python 2 unichr()
của câu hỏi. Giải pháp struct
có lợi thế là tạo ra một byte một cách chính xác bất kể phiên bản của Python. Nếu bạn muốn gửi dữ liệu qua cổng nối tiếp với chr()
, bạn cần có quyền kiểm soát mã hóa phải diễn ra sau đó.Mã có thể hoạt động khi mã hóa mặc định được sử dụng bởi Python 3 là UTF-8 (mà tôi nghĩ là trường hợp), nhưng điều này là do thực tế là các ký tự Unicode của điểm mã nhỏ hơn 256 có thể được mã hóa thành một byte đơn trong UTF -số 8. Điều này cho biết thêm một lớp không cần thiết của sự tinh tế và phức tạp mà tôi không khuyên bạn nên (nó làm cho mã khó hiểu hơn và, nếu cần, gỡ lỗi). Vì vậy, tôi đặc biệt khuyên bạn nên sử dụng cách tiếp cận ở trên (cũng được gợi ý bởi Steve Barnes và Martijn Pieters): nó cho thấy rõ ràng rằng bạn muốn tạo ra một byte (và không phải là ký tự). Nó sẽ không cung cấp cho bạn bất kỳ bất ngờ ngay cả khi bạn chạy mã của bạn với Python 3, và nó làm cho ý định của bạn rõ ràng hơn và rõ ràng hơn.
python2 hoặc Python3? (đoán Python2, nhưng làm cho khá sự khác biệt) Bạn có chắc chắn 'unichr' là cuộc gọi bị rơi? Làm thế nào bạn đang thực sự gửi dữ liệu trả về unichr? –
'unichr()' không tồn tại trong Python 3, vì vậy đây là Python 2. 'unichr()' được đặt tên 'chr()' trong Python 3 (chuyển đổi thành một ký tự Unicode). – EOL