Fra*_*cis -1 python indexing bytestring python-3.x
我正在使用Python来分割2个字节的字符串b'\x01\x00'.字节串存储在一个名为的变量中flags.
为什么当我说flags[0]我能得到b'\x00',但当我说flags[0:1]我得到预期的答案b'\x01'.
两个操作是否应该完全相同?
我做了什么:
>>> flags = b'\x01\x00'
>>> flags[0:1]
b'\x01'
>>> bytes(flags[0])
b'\x00'
Run Code Online (Sandbox Code Playgroud)
在Python 3中,bytes是一个包含整数的序列类型(每个都在0 - 255范围内),因此索引到特定索引会给出一个整数.
就像切片列表为切片生成一个新的列表对象一样,切片bytes对象也会产生一个新的bytes实例.并且bytes实例的表示尝试向您显示一个b'...'文字语法,当字节不可打印时,整数表示为可打印的ASCII字符或适用的转义序列.所有这些都非常适合开发,但可能隐藏字节实际上是整数序列的事实.
但是,您仍将获得相同的信息 ; flags[0:1]是一个单字节长的bytes值,其中包含\x01字节,flags[0]并将给出整数1:
>>> flags = b'\x01\x00'
>>> flags[0]
1
>>> flags[0:1]
b'\x01'
Run Code Online (Sandbox Code Playgroud)
你真正做的不是用flags[0],bytes(flags[0])而是你使用了.将单个整数传递给该bytes()类型会创建一个bytes指定长度的新对象,预先填充\x00字节:
>>> flags[0]
1
>>> bytes(1)
b'\x00'
Run Code Online (Sandbox Code Playgroud)
因为flags[0]产生整数1,你告诉你bytes()返回一个长度为1的新字节值,用\x00字节填充.
从bytes文档:
字节对象是单个字节的不可变序列.
[...]
虽然字节文字和表示基于ASCII文本,但字节对象实际上表现为不可变的整数序列,序列中的每个值都受到限制
0 <= x < 256.[...]
除了文字形式之外,还可以通过许多其他方式创建字节对象:
- 指定长度的零填充字节对象:
bytes(10)
大胆强调我的.
如果要创建一个bytes包含该字节的新对象,则需要先将整数值放入列表中:
>>> bytes([flags[0]])
b'\x01'
Run Code Online (Sandbox Code Playgroud)