在Python中将字节转换为位

51 投票
14 回答
207826 浏览
提问于 2025-04-17 09:59

我正在使用Python3.2。我需要输入一个十六进制的字符串,并在位的层面上进行解析。所以我用了

bytes.fromhex(input_str)

这个方法把字符串转换成了实际的字节。现在我该怎么把这些字节转换成比特呢?

14 个回答

34

在处理整数时,操作会快得多。特别是,这里提到的将数据转换成字符串的方式,速度非常慢。

如果你只想要第7和第8位,可以使用例如:

val = (byte >> 6) & 3

(这其实是把字节向右移动6位——丢掉前面的位。然后只保留最后两位,3就是前两位都为1的数字……)

这些操作可以很容易地转化为简单的CPU操作,速度非常快。

40

那这样做怎么样呢?

>>> bin(int('ff', base=16))
'0b11111111'

这段代码会把你手上的十六进制字符串转换成一个整数,然后再把这个整数转换成一个字符串,其中每个字节会根据整数的位值被设置为0或1。

正如评论中提到的,如果你想去掉前面的0b,可以这样做:

>>> bin(int('ff', base=16))[2:]
'11111111'

...或者,如果你使用的是Python 3.9或更新的版本:

>>> bin(int('ff', base=16)).removepreffix('0b')
'11111111'

注意:在这里使用lstrip("0b")会导致整数0被转换成一个空字符串。这通常不是你想要的结果。

51

另一种方法是使用bitstring这个模块:

>>> from bitstring import BitArray
>>> input_str = '0xff'
>>> c = BitArray(hex=input_str)
>>> c.bin
'0b11111111'

如果你需要去掉开头的0b的话:

>>> c.bin[2:]
'11111111'

虽然bitstring模块不是必须的,正如jcollado的回答所示,但它提供了很多高效的方法,可以把输入转换成比特并进行操作。你可能会觉得这很方便(或者不方便),比如:

>>> c.uint
255
>>> c.invert()
>>> c.bin[2:]
'00000000'

等等。

撰写回答