Как поменять байтов 32-битовое целое в python?

Возьмем этот пример:

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

Каким будет swap32-function()? Есть ли способ байтового обмена int в python, в идеале со встроенными инструментами?

Ответы

Ответ 1

Один из методов заключается в использовании модуля struct:

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

Сначала вы суммируете целое число в двоичный формат с использованием одной континентности, затем вы распаковываете его с помощью другого (даже не важно, какую комбинацию вы используете, поскольку все, что вы хотите сделать, это согласование подкачки).

Ответ 2

Большой endian означает, что макет 32-битного int имеет самый старший байт,

например. 0x12345678 имеет макет памяти

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

в то время как на маленьком конце, макет памяти

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

Итак, вы можете просто конвертировать между ними с некоторой маскировкой и сдвигом бит:

def swap32(x):
    return (((x << 24) & 0xFF000000) |
            ((x <<  8) & 0x00FF0000) |
            ((x >>  8) & 0x0000FF00) |
            ((x >> 24) & 0x000000FF))

Ответ 3

Из python 3.2 вы можете определить функцию swap32() следующим образом:

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

Он использует массив байтов для представления значения и отменяет порядок байтов, изменяя значение endianness во время преобразования обратно в целое число.