Chuyển đổi byte thành int?


84

Tôi hiện đang làm việc trên một chương trình mã hóa / giải mã và tôi cần có thể chuyển đổi byte thành số nguyên. Tôi biết điều đó:

bytes([3]) = b'\x03'

Tuy nhiên, tôi không thể tìm ra cách làm ngược lại. Tôi đang làm gì sai khủng khiếp?


2
Ngoài ra còn có structmô-đun nếu bạn muốn chuyển đổi nhiều biến cùng một lúc.
tdelaney

Câu trả lời:


131

Giả sử bạn đang sử dụng ít nhất 3.2, có một tính năng được tích hợp sẵn cho việc này :

int.from_bytes ( byte, byteorder, *, sign = False )

...

Các byte đối số phải là một đối tượng giống byte hoặc một byte tạo ra có thể lặp lại.

Đối số byteorder xác định thứ tự byte được sử dụng để biểu diễn số nguyên. Nếu thứ tự byte là "lớn", byte quan trọng nhất ở đầu mảng byte. Nếu thứ tự byte là "nhỏ", byte quan trọng nhất nằm ở cuối mảng byte. Để yêu cầu thứ tự byte gốc của hệ thống máy chủ, hãy sử dụng sys.byteorder làm giá trị thứ tự byte.

Đối số có dấu cho biết liệu phần bù của hai có được sử dụng để biểu diễn số nguyên hay không.


## Examples:
int.from_bytes(b'\x00\x01', "big")                         # 1
int.from_bytes(b'\x00\x01', "little")                      # 256

int.from_bytes(b'\x00\x10', byteorder='little')            # 4096
int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)  #-1024

Cảm ơn. Có sự khác biệt giữa int.from_bytesord(b'\x03')đối với byte / ký tự đơn không?
Bill

Sự khác biệt duy nhất tôi có thể nghĩ đến là int.from_bytescó thể giải thích các byte như là một số nguyên ký nếu bạn nói với nó để - int.from_bytes(b'\xe4', "big", signed=True)lợi nhuận -28, trong khi ord()hoặc int.from_bytestrong lợi nhuận chế độ unsigned 228.
Peter DeGlopper

6

Danh sách các byte có thể chỉ ra được (ít nhất là trong Python 3.6). Bằng cách này, bạn có thể truy xuất giá trị thập phân của từng byte riêng lẻ.

>>> intlist = [64, 4, 26, 163, 255]
>>> bytelist = bytes(intlist)       # b'@x04\x1a\xa3\xff'

>>> for b in bytelist:
...    print(b)                     # 64  4  26  163  255

>>> [b for b in bytelist]           # [64, 4, 26, 163, 255]

>>> bytelist[2]                     # 26 

1
int.from_bytes( bytes, byteorder, *, signed=False )

không hoạt động với tôi Tôi đã sử dụng chức năng từ trang web này, nó hoạt động tốt

https://coderwall.com/p/x6xtxq/convert-bytes-to-int-or-int-to-bytes-in-python

def bytes_to_int(bytes):
    result = 0
    for b in bytes:
        result = result * 256 + int(b)
    return result

def int_to_bytes(value, length):
    result = []
    for i in range(0, length):
        result.append(value >> (i * 8) & 0xff)
    result.reverse()
    return result
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.