混淆二进制字符串中的位数(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输入一个三位数 输出百位十位个位数字的二进制数?
Android 安装包优化资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )