我想将字节字符串的第一个字节连接到字符串的结尾:
a = b'\x14\xf6'
a += a[0]
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to int
Run Code Online (Sandbox Code Playgroud)
当我输入时,bytes(a[0])我得到:
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Run Code Online (Sandbox Code Playgroud)
并bytes({a[0]})给出正确的b'\x14'.
我为什么需要{}?
Blc*_*ght 11
字节不像字符串那样工作.使用单个值(而不是切片)进行索引时,将获得整数,而不是长度为一的bytes实例.在你的情况下,a[0]是20(十六进制0x14).
bytes构造函数也会出现类似的问题.如果将一个整数作为参数传递(而不是可迭代),则会得到一个bytes包含许多空字节("\x00")的实例.这解释了为什么bytes(a[0])给你二十个空字节.带有大括号的版本可以工作,因为它创建了一个集合(可迭代).
为了做你想做的事情,我建议切片a[0:1]而不是用单个值索引.这将为您提供一个bytes可以连接到现有值的实例.
a += a[0:1]
Run Code Online (Sandbox Code Playgroud)
如果要更改字节序列,则应使用a bytearray.它是可变的并且具有以下.append方法:
>>> a = bytearray(b'\x14\xf6')
>>> a.append(a[0])
>>> a
bytearray(b'\x14\xf6\x14')
Run Code Online (Sandbox Code Playgroud)
您的方法会发生什么:当您这样做时
a += a[0]
Run Code Online (Sandbox Code Playgroud)
您正在尝试向bytes对象添加整数.这没有意义,因为你试图添加不同的类型.
如果你这样做
bytes(a[0])
Run Code Online (Sandbox Code Playgroud)
你得到一个bytes长度为20 的对象,正如文档描述:
如果[参数]是一个整数,则该数组将具有该大小,并将使用空字节进行初始化.
如果使用花括号,则创建一个set,并在构造函数中选择另一个选项:
如果它是可迭代的,则它必须是0 <= x <256范围内的整数可迭代,它们用作数组的初始内容.
bytes是序列类型.它的各个元素是整数.如果是列表,a + a[0]你不能做同样的事情你不能做.您只能将序列与另一个序列连接起来.a + a[0]a
bytes(a[0])给你的是因为a[0]是一个整数,并且如记录所做的那样bytes(someInteger)为你提供了许多零字节的序列(例如,bytes(3)给你3个零字节).
{a[0]}是一套.当您将该集bytes({a[0]})的内容转换为bytes对象时.这通常不是一个很好的方法,因为集合是无序的,所以如果你尝试用多个字节来完成它,你可能无法得到你所期望的.
做你想做的最简单的方法是a + a[:1].你也可以这样做a + bytes([a[0]]).创建单元素字节对象没有捷径; 您必须使用切片或制作该字节的长度一个序列.
| 归档时间: |
|
| 查看次数: |
50399 次 |
| 最近记录: |