Как поменять местами 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.