Как поменять байтов 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 во время преобразования обратно в целое число.