2009-12-11 54 views
15

Tôi đang đọc trong một mảng/danh sách byte từ ổ cắm. Tôi muốn Python để xử lý các byte đầu tiên như là một "số nguyên 8 bit unsigned". Làm thế nào là nó có thể nhận được giá trị số nguyên của nó như là một số nguyên 8 bit không dấu?Chuyển đổi byte Python thành "số nguyên 8 bit không dấu"

+1

Nếu bạn sẵn sàng chấp nhận sự phụ thuộc vào 'numpy', một số hàm của chúng có một' dtype' arg, mà bạn có thể đặt thành 'numpy.uint8'. Ví dụ: 'bytestream = numpy.fromfile (infile, dtype = numpy.uint8)' – CrazyPyro

Trả lời

21

Sử dụng mô-đun struct.

import struct 
value = struct.unpack('B', data[0])[0] 

Lưu ý rằng việc giải nén luôn trả về một bộ, ngay cả khi bạn chỉ giải nén một mục.

Ngoài ra, hãy xem this SO question.

+0

bạn có thể hiển thị như thế nào không? – bbb

+0

vì vậy những gì được lưu trữ trong struct.unpack ('B', dữ liệu [0]) [1]? – bbb

+0

dữ liệu [0] là byte đầu tiên bạn nhận được. unpack ("B", dữ liệu [0]) xử lý byte đó là số nguyên không dấu 8 bit (được gọi là unsigned char trong C) và trả về một tuple chứa số nguyên đó (bạn đã vượt qua 2 byte để giải nén, bạn sẽ làm gì đó như giải nén ("BB", dữ liệu [0: 2]) và lấy lại 2 bộ). [0] cuối cùng nhận được mục đầu tiên (và duy nhất) trong tuple. – codeape

7

byte/bytearray là một chuỗi các số nguyên. Nếu bạn chỉ cần truy cập vào một phần tử bằng cách chỉ số của nó bạn sẽ có một số nguyên:

>>> b'abc' 
b'abc' 
>>> _[0] 
97 

Theo định nghĩa rất họ, byte và bytearrays chứa số nguyên trong range(0, 256). Vì vậy, chúng là "số nguyên 8 bit không dấu".

+0

ví dụ, tôi có điều này trong mã phía máy chủ của tôi data = conn.recv (1000000) miễn là tôi hiểu tôi nhận byte ... vì vậy tôi muốn dữ liệu [0] được coi là "số nguyên không dấu 8 bit". sao có thể như thế được? – bbb

+0

Điều này chỉ hoạt động trong Python 3.x. Python 2.6 có cú pháp b'string literal, nhưng nó chỉ là một bí danh cho str, và các phiên bản cũ hơn sẽ cung cấp cho bạn một SyntaxError. – musicinmybrain

+0

@musicinmybrain: đó là lý do tại sao câu hỏi này được gắn thẻ là 'python-3.x' Tôi đoán – SilentGhost

7

Một tùy chọn rất hợp lý và đơn giản, nếu bạn chỉ cần giá trị số nguyên byte đầu tiên, sẽ là một cái gì đó như sau:

value = ord(data[0]) 

Nếu bạn muốn giải nén tất cả các yếu tố của dữ liệu nhận được bạn cùng một lúc (và chúng không chỉ là một mảng đồng nhất), hoặc nếu bạn đang xử lý các đối tượng nhiều byte như các số nguyên 32 bit, thì bạn sẽ cần phải sử dụng một cái gì đó giống như mô-đun struct.

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