Python字节连接

新手上路,请多包涵

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

 a = b'\x14\xf6'
a += a[0]

我得到一个错误:

 Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to int

当我键入 bytes(a[0]) 我得到:

 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

并且 bytes({a[0]}) 给出了正确的 b'\x14'

为什么我需要 {}

原文由 Alexandre AMORTILA 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 396
2 个回答

字节不像字符串那样工作。当您使用单个值(而不是切片)进行索引时,您会得到一个整数,而不是长度为一的 bytes 实例。在你的情况下, a[0]20 (十六进制 0x14 )。

bytes 构造函数也会发生类似的问题。如果你传递一个整数作为参数(而不是一个可迭代的),你会得到一个 bytes 包含那么多空字节的实例( "\x00" )。这解释了为什么 bytes(a[0]) 给你二十个空字节。带有大括号的版本有效,因为它创建了一个集合(可迭代)。

做你想做的,我建议切片 a[0:1] 而不是用单个值索引。这将为您提供一个 bytes 实例,您可以将其连接到现有值上。

 a += a[0:1]

原文由 Blckknght 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果你想改变你的字节序列,你应该使用 bytearray 。它是可变的并且有 .append 方法:

 >>> a = bytearray(b'\x14\xf6')
>>> a.append(a[0])
>>> a
bytearray(b'\x14\xf6\x14')


你的方法会发生什么:当你这样做时

a += a[0]

您正在尝试将一个整数添加到 bytes 对象。这没有意义,因为您正在尝试添加不同的类型。

如果你这样做

bytes(a[0])

你得到一个 bytes 长度为 20 的对象,如 文档 所述:

如果 [参数] 是整数,则数组将具有该大小并将用空字节初始化。

如果您使用大括号,则您正在创建一个 set ,并且在构造函数中选择了一个不同的选项:

如果它是可迭代对象,则它必须是 0 <= x < 256 范围内整数的可迭代对象,用作数组的初始内容。

原文由 Jasper 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进