混淆二进制字符串中的位数(Python)

Posted

技术标签:

【中文标题】混淆二进制字符串中的位数(Python)【英文标题】:Confusion on number of bits in binary string (Python) 【发布时间】:2021-11-05 09:41:54 【问题描述】:

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

bin(int.from_bytes(b'\xa8LeW', byteorder=sys.byteorder)) 这产生了0b1010111011001010100110010101000。据我了解,0b 是一个前缀,表示它是二进制的,其余的是二进制字符串。但是,无论我计算多少次,我都只能看到0b 之后的 31 位,但是,len(b'\xa8LeW') 产生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 计算我期望的位数,但是当我查看字符串时,我似乎缺少一个?

【问题讨论】:

不显示前导零位。 0b0101 == 0b101 不知道,谢谢 请注意,x.count("0") 正在计算 0b 中的额外 0,以抵消差异。 您可以始终按照您想要的方式格式化输出:x=int.from_bytes(b'\xa8LeW', byteorder=sys.byteorder) 然后s = f'x:032b' 将显示前导零 【参考方案1】:

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

>>> 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

【讨论】:

以上是关于混淆二进制字符串中的位数(Python)的主要内容,如果未能解决你的问题,请参考以下文章

python中%如何将一个三位数转化为二进制的形式

python输入一个三位数 输出百位十位个位数字的二进制数?

Python全栈__字符串初识及操作

Android 安装包优化资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )

Python / Django 中的 Unicode 与 UTF-8 混淆?

将十六进制转换为 Swift 格式的字符串以保持相同的位数