Python中整数的字节序
我正在开发一个程序,里面需要把一些数据存储在整数中,并进行位操作。比如,我可能会接收到数字48,然后逐位处理它。一般来说,整数的字节序(也就是数据在内存中存储的顺序)是依赖于机器的表示方式的。但是,Python有没有什么办法保证整数总是以小端格式存储呢?还是说我需要像在C语言中那样检查字节序,然后为两种情况写不同的代码呢?
我之所以问这个,是因为我的代码在一台Sun机器上运行,虽然现在这台机器使用的是Intel处理器,但将来我可能需要换到一台使用Sun处理器的机器,而我知道那种机器是大端格式。
4 个回答
下面这段代码可以告诉你你的系统默认是小端模式(如果不是,就是大端模式)。
import struct
little_endian = (struct.unpack('<I', struct.pack('=I', 1))[0] == 1)
不过要注意,这个设置不会影响位运算符的行为:1<<1
的结果总是等于2
,无论你的系统是小端还是大端。
如果你需要对数据进行“位操作”,那么bitstring
这个模块可能会对你有帮助。它还可以处理不同平台之间的数据字节顺序问题。
struct
模块是处理不同平台之间字节顺序的最佳标准方法。举个例子,它可以把整数1、2、3打包成两个“短整型”和一个“长整型”(在大多数平台上分别是2字节和4字节),使用的是本地的字节顺序:
>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
要以编程方式检查平台的字节顺序,你可以使用
>>> import sys
>>> sys.byteorder
这个方法会返回"big"
或"little"
。
Python中的int
类型和你电脑的处理器使用的是一样的字节序。字节序就是数据在内存中存放的顺序。struct
模块可以让你把字节数据转换成整数(也可以反过来,还有其他数据类型),你可以选择使用本地字节序、字节序小端(little-endian)或字节序大端(big-endian),这取决于你选择的格式字符串。如果格式字符串以@
开头,或者没有字节序字符,就会使用本地字节序(同时使用本地大小),其他的则使用标准大小;用'~'表示本地,'<'表示小端,'>'或'!'表示大端。
这里说的是逐字节处理,而不是逐比特处理;我不太确定你在这个上下文中提到的逐比特处理具体指什么,但我想应该可以用类似的方法来处理。
如果你想快速处理大量简单的数据,可以考虑使用array模块——fromstring
和tostring
方法可以快速处理大量字节,而byteswap
方法可以快速转换字节序(从本地字节序转换为非本地,或者反过来),同样适用于大量数据(整个数组)。