Hướng dẫn python change endianness - python thay đổi tuổi thọ

Nếu bạn sử dụng chức năng

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
5 của Numpy, bạn có thể xây dựng một
i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
6 không thực sự chia sẻ bộ nhớ vật lý của
i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
7, và sau đó các hành động hoán đổi có thể được thực hiện tại chỗ thay vì trong một bản sao.

Nội dung chính ShowShow

  • Giới thiệu về đặt hàng byte và ndarrays#
  • Thay đổi đơn đặt hàng byte#
  • Dữ liệu và endianness dtype don don phù hợp, thay đổi dtype để khớp dữ liệu#
  • Dữ liệu và loại endianness don lồng khớp, thay đổi dữ liệu để khớp với DTYPE#
  • Dữ liệu và kết hợp endianness của dtype, dữ liệu hoán đổi và dtype#
  • Làm thế nào để bạn chuyển đổi byte trong Python?
  • Byteorder trong Python là gì?
  • Python là nhỏ hay endian lớn?
  • Hoán đổi byte là gì?

Bạn có thể chỉ cần thực hiện cùng một chỉ mục trực tiếp trên

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
8, chẳng hạn như
byt[i] = byt[i+1]

Nhưng có được một tay cầm cho mảng được đệm với một loại rõ ràng trong Numpy thường cho phép bạn làm nhiều hơn, đặc biệt là với

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
7 rất hạn chế.

Hãy cẩn thận mặc dù. Mặc dù ở cấp độ Python,

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
7 đại diện cho các giá trị số nguyên 8 bit không dấu (0-255), việc triển khai C cơ bản thực tế, trong
def swap32(i):
    return struct.unpack("I", i))[0]
1 sử dụng đơn giản
def swap32(i):
    return struct.unpack("I", i))[0]
2 cho các giá trị byte (xem ở đây để biết thêm thông tin). Nếu sử dụng Numpy cho việc này, có lẽ bạn muốn chỉ định đối số
def swap32(i):
    return struct.unpack("I", i))[0]
3 tùy chọn thành
i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
5, với
def swap32(i):
    return struct.unpack("I", i))[0]
5.
i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
2

Nó in

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
3

Tôi đã gặp phải một số vấn đề này trong khi làm việc trên một dự án nhỏ có tên Buffersort, có thể thực hiện việc sắp xếp tại chỗ trên các đối tượng Python thực hiện giao thức bộ đệm có thể ghi, như

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
7.

Nếu bạn quan tâm đến việc lấy nguồn Cython từ đó, có một chức năng trợ giúp đơn giản

def swap32(i):
    return struct.unpack("I", i))[0]
7 sẽ giúp bạn dễ dàng làm những gì bạn muốn. Nó có thể rất quá mức cần thiết cho trường hợp sử dụng của bạn.

29

Nội dung chính ShowShowShow

  • Giới thiệu về đặt hàng byte và ndarrays#
  • Thay đổi đơn đặt hàng byte#
  • Dữ liệu và endianness dtype don don phù hợp, thay đổi dtype để khớp dữ liệu#
  • Dữ liệu và loại endianness don lồng khớp, thay đổi dữ liệu để khớp với DTYPE#
  • Dữ liệu và kết hợp endianness của dtype, dữ liệu hoán đổi và dtype#
  • Làm thế nào để bạn chuyển đổi byte trong Python?
  • Byteorder trong Python là gì?
  • Python là nhỏ hay endian lớn?
  • Hoán đổi byte là gì?

Bạn có thể chỉ cần thực hiện cùng một chỉ mục trực tiếp trên
Learn more.

Nội dung chính Show

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

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

Thay đổi đơn đặt hàng byte#

Dữ liệu và endianness dtype don don phù hợp, thay đổi dtype để khớp dữ liệu#Dec 16, 2014 at 14:05

Dữ liệu và loại endianness don lồng khớp, thay đổi dữ liệu để khớp với DTYPE#Patrick B.

Dữ liệu và kết hợp endianness của dtype, dữ liệu hoán đổi và dtype#8 gold badges55 silver badges97 bronze badges

5

Làm thế nào để bạn chuyển đổi byte trong Python?

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
70:
def swap32(i):
    return struct.unpack("I", i))[0]

Byteorder trong Python là gì?

Python là nhỏ hay endian lớn?Dec 16, 2014 at 14:16

Hoán đổi byte là gì?Carsten

Bạn có thể chỉ cần thực hiện cùng một chỉ mục trực tiếp trên 4 gold badges46 silver badges53 bronze badges

5

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
8, chẳng hạn như
byt[i] = byt[i+1]

Nhưng có được một tay cầm cho mảng được đệm với một loại rõ ràng trong Numpy thường cho phép bạn làm nhiều hơn, đặc biệt là với

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
7 rất hạn chế.

Hãy cẩn thận mặc dù. Mặc dù ở cấp độ Python,

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
2

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
7 đại diện cho các giá trị số nguyên 8 bit không dấu (0-255), việc triển khai C cơ bản thực tế, trong
def swap32(i):
    return struct.unpack("I", i))[0]
1 sử dụng đơn giản
def swap32(i):
    return struct.unpack("I", i))[0]
2 cho các giá trị byte (xem ở đây để biết thêm thông tin). Nếu sử dụng Numpy cho việc này, có lẽ bạn muốn chỉ định đối số
def swap32(i):
    return struct.unpack("I", i))[0]
3 tùy chọn thành
i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
5, với
def swap32(i):
    return struct.unpack("I", i))[0]
5.
i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
2

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
20

Nó inDec 16, 2014 at 14:17

Tôi đã gặp phải một số vấn đề này trong khi làm việc trên một dự án nhỏ có tên Buffersort, có thể thực hiện việc sắp xếp tại chỗ trên các đối tượng Python thực hiện giao thức bộ đệm có thể ghi, như nos

Nếu bạn quan tâm đến việc lấy nguồn Cython từ đó, có một chức năng trợ giúp đơn giản 54 gold badges405 silver badges493 bronze badges

2

def swap32(i):
    return struct.unpack("I", i))[0]
7 sẽ giúp bạn dễ dàng làm những gì bạn muốn. Nó có thể rất quá mức cần thiết cho trường hợp sử dụng của bạn.

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
21

Nội dung chính ShowShow

Để xem xét, hoán đổi byte đảo ngược thứ tự của byte trong một số nguyên (cho dù độ dài 2, 4, hoặc 8 byte).Điều này là cần thiết khi các bộ xử lý X86 lưu trữ byte thứ tự thấp của số nguyên trước ("Little Endian") và bộ xử lý SPARC lưu trữ byte bậc cao trước tiên ("Big Endian").reverses the order of bytes in a integer (whether 2-, 4-, or 8-byte lengths). This is necessary as x86 processors store the low order byte of an integer first ("little endian"), and SPARC processors store the high-order byte first ("big endian").Learn more.Mar 10, 2016 at 2:20

1

Dữ liệu và endianness dtype don don phù hợp, thay đổi dtype để khớp dữ liệu#Dec 16, 2014 at 14:05

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
22

Dữ liệu và loại endianness don lồng khớp, thay đổi dữ liệu để khớp với DTYPE#Patrick B.

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

RobdrobdRobDRobDRobD

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

1

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

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
71 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 :

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
24

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

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
71 để 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:
i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
26

Lưu ý mảng

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
73 ở trên của
i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
74.
i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
75 có nghĩa là ‘lớn endian (
i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
76 là ít endian) và
i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
77 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à
i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
78.

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

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
33

Quay trở lại

i = 0x12345678
print("{:08x}".format(i))
   # shows 12345678
i = swap32(i)
print("{:08x}".format(i))
   # should print 78563412
79 của chúng tôi-trong trường hợp này, dữ liệu cơ bản của chúng tôi là Big-endian (Data Endianness) và chúng tôi đã đặt DTYPE phù hợp (DTYPE cũng là Big-Endian). Tuy nhiên, đôi khi bạn cần phải lật những thứ này xung quanh.

Cảnh báo

Scalars hiện không bao gồm thông tin thứ tự byte, do đó, trích xuất một vô hướng từ một mảng sẽ trả về một số nguyên theo thứ tự byte gốc. Kể từ đây:

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

Thay đổi đơn đặt hàng byte#

Như bạn có thể tưởng tượng từ phần giới thiệu, có hai cách bạn có thể ảnh hưởng đến mối quan hệ giữa thứ tự byte của mảng và bộ nhớ cơ bản mà nó đang nhìn vào:

  • Thay đổi thông tin đặt hàng byte trong DTYPE mảng để nó diễn giải dữ liệu cơ bản là theo thứ tự byte khác. Đây là vai trò của

    i = 0x12345678
    print("{:08x}".format(i))
       # shows 12345678
    i = swap32(i)
    print("{:08x}".format(i))
       # should print 78563412
    
    20
  • Thay đổi thứ tự byte của dữ liệu cơ bản, để lại cách giải thích DTYPE. Đây là những gì

    i = 0x12345678
    print("{:08x}".format(i))
       # shows 12345678
    i = swap32(i)
    print("{:08x}".format(i))
       # should print 78563412
    
    21 làm.

Các tình huống phổ biến mà bạn cần thay đổi thứ tự byte là:

  1. Dữ liệu và endianness dty của bạn phù hợp với nhau và bạn muốn thay đổi DTYPE để nó khớp với dữ liệu.

  2. Dữ liệu của bạn và DTYPE Endianness không phù hợp và bạn muốn trao đổi dữ liệu để chúng khớp với DTYPE

  3. Dữ liệu của bạn và sự phù hợp với endianness của bạn, nhưng bạn muốn dữ liệu được hoán đổi và DTYPE để phản ánh điều này

Dữ liệu và endianness dtype don don phù hợp, thay đổi dtype để khớp dữ liệu#

Chúng tôi làm một cái gì đó mà họ không phù hợp:

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

Bản sửa lỗi rõ ràng cho tình huống này là thay đổi DTYPE để nó đưa ra sự chính xác:

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

Lưu ý rằng mảng không thay đổi trong bộ nhớ:

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

Dữ liệu và loại endianness don lồng khớp, thay đổi dữ liệu để khớp với DTYPE#

Bạn có thể muốn làm điều này nếu bạn cần dữ liệu trong bộ nhớ là một thứ tự nhất định. Ví dụ: bạn có thể viết bộ nhớ ra một tệp cần đặt hàng byte nhất định.

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

Bây giờ mảng đã thay đổi trong bộ nhớ:

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

Dữ liệu và kết hợp endianness của dtype, dữ liệu hoán đổi và dtype#

Bạn có thể có một mảng DTYPE được chỉ định chính xác, nhưng bạn cần mảng có thứ tự byte đối diện trong bộ nhớ và bạn muốn DTYPE khớp với các giá trị mảng có ý nghĩa. Trong trường hợp này, bạn chỉ cần thực hiện cả hai hoạt động trước đó:

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

Một cách dễ dàng hơn để chuyển dữ liệu vào một thứ tự DTYPE và byte cụ thể có thể đạt được với phương pháp NDarray Astype:

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

Làm thế nào để bạn chuyển đổi byte trong Python?

BYTESWAP () Chuyển đổi hàm giữa biểu diễn dữ liệu thấp và lớn bằng cách trả về một mảng wan byte, tùy chọn hoán đổi tại chỗ. Tham số: tại chỗ: [bool, tùy chọn] nếu đúng, hoán đổi byte tại chỗ, mặc định là sai. toggle between low-endian and big-endian data representation by returning a byteswapped array, optionally swapped in-place. Parameters: inplace : [bool, optional] If True, swap bytes in-place, default is False. toggle between low-endian and big-endian data representation by returning a byteswapped array, optionally swapped in-place. Parameters: inplace : [bool, optional] If True, swap bytes in-place, default is False. toggle between low-endian and big-endian data representation by returning a byteswapped array, optionally swapped in-place. Parameters: inplace : [bool, optional] If True, swap bytes in-place, default is False.

Byteorder trong Python là gì?

Đối số byteorder xác định thứ tự byte được sử dụng để thể hiện số nguyên. Nếu byteorder là "lớn", byte quan trọng nhất là ở đầu mảng byte. Nếu byteorder là "ít", byte quan trọng nhất là ở cuối mảng byte.determines the byte order used to represent the integer. If byteorder is "big" , the most significant byte is at the beginning of the byte array. If byteorder is "little" , the most significant byte is at the end of the byte array.determines the byte order used to represent the integer. If byteorder is "big" , the most significant byte is at the beginning of the byte array. If byteorder is "little" , the most significant byte is at the end of the byte array.determines the byte order used to represent the integer. If byteorder is "big" , the most significant byte is at the beginning of the byte array. If byteorder is "little" , the most significant byte is at the end of the byte array.

Python là nhỏ hay endian lớn?

Lưu ý rằng, Java Runtimes sử dụng định dạng endian lớn.Độ cuối của Python giống như bộ xử lý mà trình thông dịch Python được chạy.Mô -đun ổ cắm của Python cung cấp các chức năng để xử lý các bản dịch các số nguyên có kích thước khác nhau từ Little Endian đến Big Endian và ngược lại.Python's Endianness is same as the processor in which the Python interpreter is run. The socket module of Python provides functions to handle translations of integers of different sizes from Little Endian to Big Endian and vice versa.Python's Endianness is same as the processor in which the Python interpreter is run. The socket module of Python provides functions to handle translations of integers of different sizes from Little Endian to Big Endian and vice versa.Python's Endianness is same as the processor in which the Python interpreter is run. The socket module of Python provides functions to handle translations of integers of different sizes from Little Endian to Big Endian and vice versa.

Hoán đổi byte là gì?

Để xem xét, hoán đổi byte đảo ngược thứ tự của byte trong một số nguyên (cho dù độ dài 2, 4, hoặc 8 byte).Điều này là cần thiết khi các bộ xử lý X86 lưu trữ byte thứ tự thấp của số nguyên trước ("Little Endian") và bộ xử lý SPARC lưu trữ byte bậc cao trước tiên ("Big Endian").reverses the order of bytes in a integer (whether 2-, 4-, or 8-byte lengths). This is necessary as x86 processors store the low order byte of an integer first ("little endian"), and SPARC processors store the high-order byte first ("big endian").reverses the order of bytes in a integer (whether 2-, 4-, or 8-byte lengths). This is necessary as x86 processors store the low order byte of an integer first ("little endian"), and SPARC processors store the high-order byte first ("big endian").reverses the order of bytes in a integer (whether 2-, 4-, or 8-byte lengths). This is necessary as x86 processors store the low order byte of an integer first ("little endian"), and SPARC processors store the high-order byte first ("big endian").