Python3:bytes和bytearray,以及字符串与二进制数据的转换

49

我想了解Python3中的bytesbytearray类。我已经看过它们的文档,但是没有一个全面的描述它们之间的区别以及它们如何与string对象交互的说明。

1个回答

72

bytesbytearray是相似的...

(简而言之:bytes是只读的,bytearray是可读写的。)

Python 3的bytesbytearray类都保存了字节的数组,其中每个字节的值可以在0到255之间。主要的区别在于bytes对象是不可变的,意味着一旦创建,就无法修改其元素。相反,bytearray对象允许您修改其元素。

bytesbytearray都提供了用于编码和解码字符串的函数。

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'的显式顺序时,编码形式会省略字节顺序标记。
因为字节对象是不可变的,尝试更改其中一个元素会导致错误:
>>> a = bytes('tuv', 'utf-8')
>>> a
b'tuv'
>>> a[0] = 115
TypeError: 'bytes' object does not support item assignment

bytearray和编码字符串

bytes类似,可以通过多种方式构建一个bytearray:

>>> 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')

因为 bytearray 是可变的,所以你可以修改它的元素:
>>> a = bytearray('tuv', 'utf-8')
>>> a
bytearray(b'tuv')
>>> a[0]=115
>>> a
bytearray(b'suv')

追加bytesbytearray

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` 函数。该函数假设您提供的解码类型与编码类型相同。例如:
>>> 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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接