байтов и байтовых массивов похожи ...
python3 классы bytes
и bytearray
содержат массивы байтов, где каждый байт может принимать значение от 0 до 255. Основное отличие состоит в том, что объект bytes
является неизменным , что означает, что после создания вы не можете изменять его элементы. Напротив, объект bytearray
позволяет вам изменять его элементы.
bytes
и кодирование
Объект байтов может быть создан несколькими способами:
>>> bytes(5)
b'\x00\x00\x00\x00\x00'
>>> bytes([97, 98, 99])
b'abc'
>>> b'abc'
b'abc'
>>> bytes('abc')
TypeError: string argument without an encoding
>>> 'abc'.encode('utf-8')
b'abc'
>>> bytes('abc', 'utf-8')
b'abc'
>>> 'abc'.encode('utf-16')
b'\xff\xfea\x00b\x00c\x00'
>>> 'abc'.encode('utf-16-le')
b'a\x00b\x00c\x00'
Обратите внимание на разницу между двумя последними: 'utf-16' определяет общую кодировку c utf-16, поэтому его закодированная форма включает двухбайтовую преамбулу «маркер порядка байтов» [0xff, 0xfe]
. При указании явного упорядочивания 'utf-16-le', как в последнем примере, закодированная форма опускает маркер порядка байтов.
Поскольку объект bytes неизменяем, попытка изменить один из его элементов приводит к ошибка:
>>> a = bytes('abc', 'utf-8')
>>> a
b'abc'
>>> a[1] = 102
TypeError: 'bytes' object does not support item assignment
массив байтов и кодирование
Как и bytes
, массив байтов может быть создан несколькими способами:
>>> bytearray(5)
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00')
>>>bytearray([1, 2, 3])
bytearray(b'\x01\x02\x03')
>>> bytearray('abc')
TypeError: string argument without an encoding
>>> bytearray('abc', 'utf-8')
bytearray(b'abc')
>>> bytearray('abc', 'utf-16')
bytearray(b'\xff\xfea\x00b\x00c\x00')
>>> bytearray('abc', 'utf-16-le')
bytearray(b'a\x00b\x00c\x00')
Поскольку массив байтов является изменяемый , вы можете изменять его элементы:
>>> a = bytearray('abc', 'utf-8')
>>> a
bytearray(b'abc')
>>> a[1]=114
>>> a
bytearray(b'arc')
добавление байтов и байтовых массивов
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
.
преобразование байтов и объекты bytearray в строки
байты и объекты bytearray могут быть преобразованы в строки с помощью функции decode
. Функция предполагает, что вы предоставляете тот же тип декодирования, что и тип кодирования. Например:
>>> a = bytes('abc', 'utf-8')
>>> a
b'abc'
>>> a.decode('utf-8')
'abc'
>>> b = bytearray('abc', 'utf-16-le')
>>> b
bytearray(b'a\x00b\x00c\x00')
>>> b.decode('utf-16-le')
'abc'