首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Python 3中的索引字节返回一个int而不是字节?

为什么Python 3中的索引字节返回一个int而不是字节?
EN

Stack Overflow用户
提问于 2020-05-09 23:47:55
回答 2查看 900关注 0票数 4

试图理解为什么接受字节对象的索引会返回一个不能解码的int,但是切片会返回一个可以解码的字节对象。这似乎不合常理。当您对字符串执行相同的操作时,在字符串位置使用索引仍然会返回一个字符串。

在处理密码挑战时,我尝试在字节数组上迭代,对XORed字符串进行频率分析,以计数纯文本字母的出现数。我想我可以做以下工作,但是我得到了'int‘对象没有属性'decode’错误。从读取Python文档中可以看出,字节数组是一个可变的整数序列,但是在解释器中进行测试时,我期待的是不同的行为。

代码语言:javascript
复制
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是一个int,所以这是行不通的。但如果我用r0:1,它会吗?我意识到我可以只调用chr(r),但我想如果r.decode()工作,r.decode()也应该能工作。

代码语言:javascript
复制
>>> 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'

字符串示例

代码语言:javascript
复制
>>> x = 'AB'
>>> type(x)
<class 'str'>
>>> x[0]
'A'
>>> type(x[0])
<class 'str'>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-10 16:17:03

bytes对象作为int进行迭代的原因是,它们在概念上是从0到255 (按照PEP 358)-not交替编码字符串之间的字节整数组成的静态数组。交替文本编码是一种常见的用例,但读取和写入任意二进制数据也同样重要。

特别是关于str.encodebytes.decode,调用some_bytes[0].decode并不一定有意义,因为在许多编码中,字符可能被编码为多个字节。例如,b'a'.decode('utf-32')失败是因为UTF-32每个字符使用四个字节。

围绕佩普467的讨论提出了添加bytes.iterbytes等内容,可能会为bytes的行为提供更多的了解。

票数 1
EN

Stack Overflow用户

发布于 2020-05-10 00:31:46

你已经发现了字节迭代器生成整数,而不是字符。。您需要使用chrint值转换为str值。

代码语言:javascript
复制
import collections
import string

str_a = b"\x1b77316?x\x15\x1b\x7f+x413=x9x(7-6<x7>x:9;76"
count = collections.defaultdict(int)

for value in str_a:
    value = chr(value).upper()
    if value in string.ascii_uppercase:
        count[value] += 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61705338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档