我正在开发一个程序,我将一些数据存储在一个整数中并按位处理。例如,我可能会收到数字 48,我将逐位处理它。一般来说,整数的字节序取决于整数的机器表示,但是 Python 是否会做任何事情来保证整数总是小字节序?还是我需要像在 C 中那样检查字节顺序,然后为这两种情况编写单独的代码?
我问是因为我的代码在 Sun 机器上运行,虽然它现在运行的机器使用 Intel 处理器,但我将来可能不得不切换到带有 Sun 处理器的机器,我知道这是大端的。
我正在开发一个程序,我将一些数据存储在一个整数中并按位处理。例如,我可能会收到数字 48,我将逐位处理它。一般来说,整数的字节序取决于整数的机器表示,但是 Python 是否会做任何事情来保证整数总是小字节序?还是我需要像在 C 中那样检查字节顺序,然后为这两种情况编写单独的代码?
我问是因为我的代码在 Sun 机器上运行,虽然它现在运行的机器使用 Intel 处理器,但我将来可能不得不切换到带有 Sun 处理器的机器,我知道这是大端的。
Python 的int
字节顺序与其运行的处理器相同。该struct
模块允许您以本机、小端或大端方式将字节 blob 转换为 int(反之亦然,以及其他一些数据类型),具体取决于您选择的格式字符串@
:使用或不使用字节序字符开始格式使用原生字节序(和原生大小——其他所有内容都使用标准大小),'~' 表示原生,'<' 表示小端,'>' 或 '!' 对于大端。
这是逐字节的,而不是逐位的;不确定在这种情况下逐位处理的确切含义,但我认为它可以类似地适应。
对于简单情况下的快速“批量”处理,还要考虑数组模块—— fromstring
andtostring
方法可以快速处理大量字节,并且该byteswap
方法可以获得“其他”字节序(本机到非本机,反之亦然) , 再次快速地处理大量项目(整个数组)。
如果您需要“按位”处理数据,那么该bitstring
模块可能会对您有所帮助。它还可以处理平台之间的字节序。
该struct
模块是处理平台之间字节序的最佳标准方法。例如,这使用本机字节序将整数 1、2、3 打包并解包为两个“shorts”和一个“long”(在大多数平台上为 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"
。
什么时候查?
进行按位运算时, int in 将与您输入的 int 具有相同的字节序。您无需检查。您只需要在两种语言的字节序列之间转换时关心这一点,afaik。
在 Python 中,您为此使用 struct 模块,最常见的是 struct.pack() 和 struct.unpack()。
以下代码段将告诉您系统默认值是否为小端(否则为大端)
import struct
little_endian = (struct.unpack('<I', struct.pack('=I', 1))[0] == 1)
但是请注意,这不会影响按位运算符的行为:无论系统的默认字节顺序如何,1<<1
都等于。2