python3:bytes与bytearray,以及与字符串之间的转换

f8rj6qna  于 2023-03-04  发布在  Python
关注(0)|答案(1)|浏览(147)

我想了解python3的bytesbytearray类,我看过关于它们的文档,但没有全面描述它们的区别以及它们如何与string对象交互。

nzk0hqpo

nzk0hqpo1#

字节和字节数组相似...

python3的bytesbytearray类都包含字节数组,其中每个字节可以取0到255之间的值,主要区别在于bytes对象是 * 不可变的 *,这意味着一旦创建,就不能修改其元素,而bytearray对象允许修改其元素。
bytesbytearay都提供了编码和解码字符串的函数。

bytes和编码字符串

bytes对象可以用几种不同的方法构造:

>>> bytes(5)
b'\x00\x00\x00\x00\x00'

>>> bytes([116, 117, 118])
b'tuv'

>>> b'tuv'
b'tuv'

>>> bytes('tuv')
TypeError: string argument without an encoding

>>> bytes('tuv', 'utf-8')
b'tuv'

>>> 'tuv'.encode('utf-8')
b'tuv'

>>> 'tuv'.encode('utf-16')
b'\xff\xfet\x00u\x00v\x00'

>>> 'tuv'.encode('utf-16-le')
b't\x00u\x00v\x00'

请注意后两个选项之间的区别:'utf-16'指定通用的utf-16编码,因此其编码形式包括[0xff, 0xfe]的两字节“字节顺序标记”前导码。当指定'utf-16-le'的显式顺序时,如后一个示例所示,编码形式将省略字节顺序标记。
由于bytes对象是不可变的,因此尝试更改其元素之一会导致错误:

>>> a = bytes('tuv', 'utf-8')
>>> a
b'tuv'
>>> a[0] = 115
TypeError: 'bytes' object does not support item assignment

字节数组和编码字符串

bytes类似,字节数组可以通过多种方式构造:

>>> bytearray(5)
bytearray(b'\x00\x00\x00\x00\x00')

>>> bytearray([116, 117, 118])
bytearray(b'tuv')

>>> bytearray('tuv')
TypeError: string argument without an encoding

>>> bytearray('tuv', 'utf-8')
bytearray(b'tuv')

>>> bytearray('tuv', 'utf-16')
bytearray(b'\xff\xfet\x00u\x00v\x00')

>>> bytearray('abc', 'utf-16-le')
bytearray(b't\x00u\x00v\x00')

因为字节数组是 mutable 的,所以你可以修改它的元素:

>>> a = bytearray('tuv', 'utf-8')
>>> a
bytearray(b'tuv')
>>> a[0]=115
>>> a
bytearray(b'suv')

追加字节和字节数组

bytesbytearray对象可以使用+运算符连接:

>>> a = bytes(3)
>>> a
b'\x00\x00\x00'

>>> b = bytearray(4)
>>> b
bytearray(b'\x00\x00\x00\x00')

>>> a+b
b'\x00\x00\x00\x00\x00\x00\x00'

>>> b+a
bytearray(b'\x00\x00\x00\x00\x00\x00\x00')

请注意,链接结果采用第一个参数的类型,因此a+b生成bytes对象,b+a生成bytearray

将bytes和bytearray对象转换为字符串

可以使用decode函数将bytes和bytearray对象转换为字符串。该函数假定您提供的解码类型与编码类型相同。例如:

>>> a = bytes('tuv', 'utf-8')
>>> a
b'tuv'
>>> a.decode('utf-8')
'tuv'

>>> b = bytearray('tuv', 'utf-16-le')
>>> b
bytearray(b't\x00u\x00v\x00')
>>> b.decode('utf-16-le')
'tuv'

相关问题