python3:bytes 与 bytearray,以及与字符串的相互转换
python3: bytes vs bytearray, and converting to and from strings
我想了解 python3 的 bytes
和 bytearray
类。我看过关于它们的文档,但没有全面描述它们的差异以及它们如何与 string
对象交互。
字节和字节数组很相似...
python3 的 bytes
和 bytearray
类 都保存字节数组,其中每个字节可以取 0 到 255 之间的值。主要区别bytes
对象是 不可变的 ,这意味着一旦创建,您就无法修改其元素。相比之下,bytearray
对象允许您修改其元素。
bytes
和bytearay
都提供了编码和解码字符串的函数。
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
bytearray 和编码字符串
与bytes
一样,可以通过多种方式构造字节数组:
>>> bytearray(5)
bytearray(b'\x00\x00\x00\x00\x00')
>>>bytearray([1, 2, 3])
bytearray(b'\x01\x02\x03')
>>> 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')
因为字节数组是可变的,你可以修改它的元素:
>>> a = bytearray('tuv', 'utf-8')
>>> a
bytearray(b'tuv')
>>> a[0]=115
>>> a
bytearray(b'suv')
附加字节和字节数组
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 对象可以使用 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'
我想了解 python3 的 bytes
和 bytearray
类。我看过关于它们的文档,但没有全面描述它们的差异以及它们如何与 string
对象交互。
字节和字节数组很相似...
python3 的 bytes
和 bytearray
类 都保存字节数组,其中每个字节可以取 0 到 255 之间的值。主要区别bytes
对象是 不可变的 ,这意味着一旦创建,您就无法修改其元素。相比之下,bytearray
对象允许您修改其元素。
bytes
和bytearay
都提供了编码和解码字符串的函数。
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
bytearray 和编码字符串
与bytes
一样,可以通过多种方式构造字节数组:
>>> bytearray(5)
bytearray(b'\x00\x00\x00\x00\x00')
>>>bytearray([1, 2, 3])
bytearray(b'\x01\x02\x03')
>>> 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')
因为字节数组是可变的,你可以修改它的元素:
>>> a = bytearray('tuv', 'utf-8')
>>> a
bytearray(b'tuv')
>>> a[0]=115
>>> a
bytearray(b'suv')
附加字节和字节数组
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 对象可以使用 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'