python3:字节与字节数组,以及与字符串之间的转换

问题描述 投票:0回答:1

我想了解python3的

bytes
bytearray
类。我看过关于它们的文档,但没有全面描述它们的差异以及它们如何与
string
对象交互。

python-3.x utf-8 utf
1个回答
61
投票

bytes
bytearray
很相似...

Python 3 的

bytes
bytearray
类都包含字节数组,其中每个字节可以取 0 到 255 之间的值。主要区别在于
bytes
对象是 immutable,这意味着一旦创建,你不能修改它的元素。相比之下,
bytearray
对象允许您修改其元素。

bytes
bytearray
都提供了编码和解码字符串的函数。

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(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
mutable,你可以修改它的元素:

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

追加
bytes
bytearray

bytes
bytearray
对象可以与 + 运算符连接:

>>> 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
对象转换为字符串

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'
© www.soinside.com 2019 - 2024. All rights reserved.