首页 > 解决方案 > 混淆二进制字符串中的位数(Python)

问题描述

我有一个二进制字符串b'\xa8LeW',我试图通过执行以下操作来查看“实际”二进制字符串(例如,只有 1 和 0):

bin(int.from_bytes(b'\xa8LeW', byteorder=sys.byteorder)) 这产生了0b1010111011001010100110010101000。据我了解,0b是一个前缀表示它是二进制的,其余的是二进制字符串。但是,无论我计算多少次,我只看到31位之后0b,但是,len(b'\xa8LeW')yield 4,意思是 32 位,并且

x = bin(int.from_bytes(b'\xa8LeW', byteorder=sys.byteorder))
x.count("0") + x.count("1")

产生32位。这是字符串再次分成字节,除了最后 7 位:

0b 10101110 11001010 10011001 0101000

我期待 4 个字节,那么为什么 python 计算我期望的位数,但是当我查看字符串时,我似乎缺少一个?

标签: pythonbinarybytebit

解决方案


就像评论中提到的那样,前导零被跳过并且它们不会改变值:

>>> 0b1
1
>>> 0b01
1
>>> 0b0000001
1

您可以格式化输出以添加它们:

>>> x = int.from_bytes(b'\xa8LeW', byteorder=sys.byteorder)
>>> f"{x:032b}"
'01010111011001010100110010101000'

还有用于检查位长度的int.bit_length方法:int

返回以二进制表示整数所需的位数,不包括符号和前导零:

>>> n = -37
>>> bin(n)
'-0b100101'
>>> n.bit_length()
6
>>> x.bit_length()
31

推荐阅读