Python字节串联

Ale*_*ILA 16 python-3.x

我想将字节字符串的第一个字节连接到字符串的结尾:

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)


Jas*_*per 8

如果要更改字节序列,则应使用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范围内的整数可迭代,它们用作数组的初始内容.


Bre*_*arn 6

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]]).创建单元素字节对象没有捷径; 您必须使用切片或制作该字节的长度一个序列.