Hướng dẫn python byte swap 16 bit - hoán đổi byte python 16 bit

29

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Lấy ví dụ này:

i = 0x12345678
print["{:08x}".format[i]]
   # shows 12345678
i = swap32[i]
print["{:08x}".format[i]]
   # should print 78563412

Điều gì sẽ là

def swap32[i]:
    return struct.unpack["I", i]][0]
8? Có cách nào để trao đổi byte một
def swap32[i]:
    return struct.unpack["I", i]][0]
9 trong Python, lý tưởng với các công cụ tích hợp không?

Hỏi ngày 16 tháng 12 năm 2014 lúc 14:05Dec 16, 2014 at 14:05

Patrick B.Patrick B.Patrick B.

11.4K8 Huy hiệu vàng55 Huy hiệu bạc97 Huy hiệu Đồng8 gold badges55 silver badges97 bronze badges

5

Một phương pháp là sử dụng mô -đun

msb             lsb
+------------------+
| 12 | 34 | 56 | 78|
+------------------+
0:

def swap32[i]:
    return struct.unpack["I", i]][0]

Trước tiên, bạn đóng gói số nguyên của mình vào định dạng nhị phân bằng cách sử dụng một endianness, sau đó bạn giải nén nó bằng cách sử dụng cái kia [thậm chí không quan trọng bạn sử dụng kết hợp nào, vì tất cả những gì bạn muốn làm là hoán đổi độ chính xác].

Đã trả lời ngày 16 tháng 12 năm 2014 lúc 14:16Dec 16, 2014 at 14:16

CarstencarstenCarsten

17,5K4 Huy hiệu vàng46 Huy hiệu bạc53 Huy hiệu Đồng4 gold badges46 silver badges53 bronze badges

5

Big Endian có nghĩa là cách bố trí của 32 bit int có byte quan trọng nhất đầu tiên,

ví dụ. 0x12345678 có bố cục bộ nhớ

msb             lsb
+------------------+
| 12 | 34 | 56 | 78|
+------------------+

Trong khi trên Little Endian, bố cục bộ nhớ là

lsb             msb
+------------------+
| 78 | 56 | 34 | 12|
+------------------+

Vì vậy, bạn chỉ có thể chuyển đổi giữa chúng với một số mặt nạ và thay đổi một chút:

def swap32[x]:
    return [[[x   8] & 0x0000FF00] |
            [[x >> 24] & 0x000000FF]]

Đã trả lời ngày 16 tháng 12 năm 2014 lúc 14:17Dec 16, 2014 at 14:17

Nosnosnos

218K54 Huy hiệu vàng405 Huy hiệu bạc493 Huy hiệu Đồng54 gold badges405 silver badges493 bronze badges

2

Từ Python 3.2, bạn có thể xác định Swap32 [] như sau:

def swap32[x]:
    return int.from_bytes[x.to_bytes[4, byteorder='little'], byteorder='big', signed=False]

Nó sử dụng mảng byte để thể hiện giá trị và đảo ngược thứ tự của byte bằng cách thay đổi độ nội đầu trong quá trình chuyển đổi trở lại số nguyên.

Đã trả lời ngày 10 tháng 3 năm 2016 lúc 2:20Mar 10, 2016 at 2:20

1

Có thể đơn giản sử dụng thư viện ổ cắm.

from socket import htonl

swapped = htonl [i]
print [hex[swapped]]

đó là nó. Thư viện này cũng hoạt động theo hướng khác với NTOHL

Đã trả lời ngày 7 tháng 2 năm 2021 lúc 15:01Feb 7, 2021 at 15:01

RobdrobdRobD

751 Huy hiệu bạc7 Huy hiệu đồng1 silver badge7 bronze badges

1

Giới thiệu về đặt hàng byte và ndarrays#

msb             lsb
+------------------+
| 12 | 34 | 56 | 78|
+------------------+
1 là một đối tượng cung cấp giao diện mảng Python cho dữ liệu trong bộ nhớ.

Nó thường xảy ra rằng bộ nhớ mà bạn muốn xem với một mảng không giống với thứ tự byte giống như máy tính mà bạn đang chạy Python.

Ví dụ, tôi có thể đang làm việc trên một máy tính với CPU nhỏ-chẳng hạn như Intel Pentium, nhưng tôi đã tải một số dữ liệu từ một tệp được viết bởi một máy tính là lớn. Hãy nói rằng tôi đã tải 4 byte từ một tập tin được viết bởi một máy tính mặt trời [lớn]. Tôi biết rằng 4 byte này đại diện cho hai số nguyên 16 bit. Trên một máy lớn, một số nguyên hai byte được lưu trữ với byte quan trọng nhất [MSB] trước tiên, và sau đó là byte ít có ý nghĩa nhất [LSB]. Do đó, các byte, theo thứ tự bộ nhớ:

  1. Số nguyên MSB 1

  2. LSB Số nguyên 1

  3. Số nguyên MSB 2

  4. LSB Số nguyên 2

Giả sử hai số nguyên trên thực tế 1 và 770. Vì 770 = 256 * 3 + 2, 4 byte trong bộ nhớ sẽ chứa tương ứng: 0, 1, 3, 2. Các byte tôi đã tải từ tệp sẽ có các nội dung này :

>>> big_end_buffer = bytearray[[0,1,3,2]]
>>> big_end_buffer
bytearray[b'\x00\x01\x03\x02']

Chúng tôi có thể muốn sử dụng

msb             lsb
+------------------+
| 12 | 34 | 56 | 78|
+------------------+
1 để truy cập các số nguyên này. Trong trường hợp đó, chúng ta có thể tạo một mảng xung quanh bộ nhớ này và nói với Numpy rằng có hai số nguyên, và chúng là 16 bit và lớn nhất:

>>> import numpy as np
>>> big_end_arr = np.ndarray[shape=[2,],dtype='>i2', buffer=big_end_buffer]
>>> big_end_arr[0]
1
>>> big_end_arr[1]
770

Lưu ý mảng

msb             lsb
+------------------+
| 12 | 34 | 56 | 78|
+------------------+
3 ở trên của
msb             lsb
+------------------+
| 12 | 34 | 56 | 78|
+------------------+
4.
msb             lsb
+------------------+
| 12 | 34 | 56 | 78|
+------------------+
5 có nghĩa là ‘lớn endian [
msb             lsb
+------------------+
| 12 | 34 | 56 | 78|
+------------------+
6 là ít endian] và
msb             lsb
+------------------+
| 12 | 34 | 56 | 78|
+------------------+
7 có nghĩa là‘ đã ký 2 byte số nguyên. Ví dụ: nếu dữ liệu của chúng tôi đại diện cho một số nguyên nhỏ 4 byte không dấu duy nhất, chuỗi DTYPE sẽ là
msb             lsb
+------------------+
| 12 | 34 | 56 | 78|
+------------------+
8.

Trong thực tế, tại sao don don chúng ta thử điều đó?

>>> little_end_u4 = np.ndarray[shape=[1,],dtype='

Bài Viết Liên Quan

Chủ Đề