举个例子:
i = 0x12345678
print("{:08x}".format(i))
# shows 12345678
i = swap32(i)
print("{:08x}".format(i))
# should print 78563412
swap32-function()
会是什么?有没有办法在python中进行字节交换int
,理想情况下是使用内置工具?
答案 0 :(得分:23)
Big endian意味着32位int的布局首先具有最重要的字节,
e.g。 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))
答案 1 :(得分:22)
一种方法是使用struct
模块:
def swap32(i):
return struct.unpack("<I", struct.pack(">I", i))[0]
首先使用一个字节序将整数打包成二进制格式,然后使用另一个解压缩它(它甚至不管你使用哪种组合,因为你想做的就是交换字节序)。
答案 2 :(得分:11)
从python 3.2中,您可以将函数swap32()定义如下:
def swap32(x):
return int.from_bytes(x.to_bytes(4, byteorder='little'), byteorder='big', signed=False)
它使用字节数组来表示值,并通过在转换期间将字节顺序更改回整数来反转字节顺序。
答案 3 :(得分:1)
使用套接字库可能更简单。
from socket import htonl
swapped = htonl (i)
print (hex(swapped))
就是这样。 这个库也适用于 ntohl