python3: байты против bytearray и преобразование в строки и из строк - PullRequest
1 голос
/ 14 июля 2020

Я хотел бы разобраться в классах python3 bytes и bytearray. Я видел документацию по ним, но не полное описание их различий и того, как они взаимодействуют с string объектами.

1 Ответ

0 голосов
/ 14 июля 2020

байтов и байтовых массивов похожи ...

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