如何在python中字节交换32位整数?

时间:2014-12-16 14:05:38

标签: python integer endianness

举个例子:

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

swap32-function()会是什么?有没有办法在python中进行字节交换int,理想情况下是使用内置工具?

4 个答案:

答案 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