在Python中将字节转换为位
我正在使用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'
等等。