G G*_*III 17 python integer endianness
我正在开发一个程序,我将一些数据存储在整数中并按位处理.例如,我可能会收到数字48,我会逐位处理.一般来说,整数的字节顺序取决于整数的机器表示,但Python是否做了什么来保证int总是小端?或者我是否需要像在C中那样检查字节序,然后为这两种情况编写单独的代码?
我问,因为我的代码在Sun机器上运行,虽然它现在运行的是使用英特尔处理器,但我可能不得不在未来切换到配备Sun处理器的机器,我知道它是大端的.
Ale*_*lli 20
Python int具有与其运行的处理器相同的字节序.该struct模块允许您以native,little-endian或big-endian方式将字节blob转换为int(反之亦然,以及其他一些数据类型),具体取决于您选择的格式字符串:使用@或不使用endianness字符启动格式使用本机字节序(和原生大小 - 其他一切使用标准大小),'〜'表示原生,'<'表示小尾数,'>'或'!' 对于大端.
这是逐字节的,而不是逐位的; 在这种情况下,不确定你的意思是逐位处理,但我认为它可以类似地适应.
对于简单的情况下快速"批量"处理,也考虑到阵列的模块- fromstring和tostring方法可在大的字节数迅速操作,并且byteswap方法可以让你的"其他"字节序(原生非本地或反之亦然) ,再次迅速和大量的项目(整个阵列).
Sco*_*ths 16
如果您需要"按位"处理数据,那么该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)
Run Code Online (Sandbox Code Playgroud)
要以编程方式检查平台的字节顺序,您可以使用
>>> import sys
>>> sys.byteorder
Run Code Online (Sandbox Code Playgroud)
将返回"big"或"little".