【发布时间】:2020-05-12 01:42:20
【问题描述】:
试图理解为什么获取字节对象的索引会返回一个您无法解码的 int,但切片会返回一个您可以解码的字节对象。这似乎不直观。当你对一个字符串做同样的操作时,在字符串位置取一个索引仍然返回一个字符串。
在处理 Cryptopals 挑战时,我正在尝试遍历字节数组以对异或字符串进行频率分析,以计算纯文本字母的出现次数。我以为我可以执行以下操作,但我得到 'int' object has not attribute 'decode' 错误。从阅读 Python 文档来看,这是有道理的,字节数组是一个可变的整数序列,但是在解释器中进行测试时,我期待不同的行为。
str_a = bytearray(b'\x1b77316?x\x15\x1b\x7f+x413=x9x(7-6<x7>x:9;76')
for x in str_a:
_ = x.decode('ascii').upper()
if _ in counts:
counts[_] += 1
如果我将变量设置为单个字节,我可以在其上调用 decode()。我想我可以遍历字节字符串中的所有字节并以相同的方式解码(因此上面的循环)。但是,由于 r[0] 是一个 int,这不起作用。但是,如果我取 r[0:1],它会吗?我意识到我可以只调用 chr(r[0]),但我认为如果 r.decode() 有效,r[0].decode() 也应该有效。
>>> r = b'A'
>>> type(r)
<class 'bytes'>
>>> r.decode('ascii')
'A'
>>> r[0:1]
b'A'
>>> r[0:1].decode('ascii')
'A'
>>> type(r[0])
<class 'int'>
>>> r[0]
65
>>> r[0].decode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'decode'
字符串示例
>>> x = 'AB'
>>> type(x)
<class 'str'>
>>> x[0]
'A'
>>> type(x[0])
<class 'str'>
【问题讨论】:
-
这似乎是 Python3 最不明智的设计决策之一。如果你想做位操作会发生什么?也许你必须使用 C++。
标签: python-3.x