我正在开发一个程序,我将一些数据存储在整数中并按位处理。例如,我可能会收到数字48,我会逐位处理。一般来说,整数的字节顺序取决于整数的机器表示,但Python是否做了什么来保证int总是小端?或者我是否需要像在C中那样检查字节顺序,然后为这两种情况编写单独的代码?

我问,因为我的代码在Sun机器上运行,虽然现在运行的代码使用的是英特尔处理器,但未来我可能不得不切换到配备Sun处理器的机器,我知道这是大端的。 / p>

有帮助吗?

解决方案

Python的 int 与其运行的处理器具有相同的字节序。 struct 模块允许您将字节blob转换为int(和反向,以及其他一些数据类型,无论是本地方式,小端方式还是大端方式,取决于格式字符串:使用 @ 启动格式或使用无字节字符来使用本机字节序(以及原生大小 - 其他所有内容使用标准大小),' 〜'为原生,'<'对于little-endian,'>'要么 '!'对于big-endian。

这是逐字节的,而不是逐位的;在这种情况下,我不确定你的意思是逐位处理,但我认为它可以被类似地容纳。

快速“批量”在简单的情况下处理,还要考虑数组模块 - fromstring tostring 方法可以快速地对大量字节进行操作, byteswap 方法可以让你获得“其他”字节。字节序(原生到非原生,反之亦然),再次迅速和大量项目(整个数组)。

其他提示

如果您需要“按位”处理数据,则 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"

检查何时?

执行按位操作时,int in将具有与您输入的int相同的endianess。您无需检查。在转换为/从两个语言的字节序列中时,您只需要关心这一点。

在Python中,您使用struct模块,最常见的是struct.pack()和struct.unpack()。

以下代码段会告诉您系统默认是否为小端(否则为big-endian)

import struct
little_endian = (struct.unpack('<I', struct.pack('=I', 1))[0] == 1)

但是,请注意,这不会影响按位运算符的行为: 1&lt;&lt; 1 等于 2 ,无论系统的默认字节顺序如何。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top