Как поменять местами 32-разрядное целое число в python?

рассмотрим пример:

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

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

3 ответов


один из методов-использовать struct модуль:

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

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


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

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

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

в то время как на little endian макет памяти

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

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

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

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

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

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