Доброго времени суток, читатели, зрители моего канала programmer's notes.
Последовательность байтов обсуждалась мною ранее, но довольно поверхностно. А поскольку нам предстоит поработать с бинарными файлами, то материал этот становится актуальным. И мы намерены в данной статье его обсудить.
Символы в Python
Начнем с самого начала. С символов и как с ними можно работать. С точки зрения Python, символ это всё равно строка, но состоящая из одного символа.
c = '1'
c1 = 'Ы'
и т.д. Что можно сделать с символом? Получить код.
print(ord(c))
print(ord(c1))
Результат
49
1067
Возможно вас удивил код 1067. Но не забывайте, что по умолчанию кодировка utf-8. В ней для разных символов разная длина кода в байтах. Для управляющих символов, стандартных знаков препинания, цифр, латинского алфавита коды однобайтовые, а для остальных по-разному. Не забывайте, что есть арабский алфавит, грузинский алфавит, иероглифы и т.д. Функция ord() выдаёт код символа и работает только с односимвольной строкой. Функцией, обратной ord() является chr().
print(chr(1000), chr(1001), chr(1002))
получаем
Ϩ ϩ Ϫ
Что это за символы, я не знаю, но функция chr() выдаёт по заданным кодам.
Бинарные строки
Теперь о строках с префиксом b. Это так называемые бинарные или байтовые строки строки (не путать с двоичными, состоящими из нолей и единиц). Например
Результат выполнения
b'1234567890'
49 49 0x31 0o61
50 50 0x32 0o62
51 51 0x33 0o63
52 52 0x34 0o64
53 53 0x35 0o65
54 54 0x36 0o66
55 55 0x37 0o67
56 56 0x38 0o70
57 57 0x39 0o71
48 48 0x30 0o60
В чем здесь отличие от обычной строки? Каждый её элемент интерпретируется как байт. Хотя t для python все равно строка, но выражающая однобайтовое число.
А что будет, если написать, например,
bt = b'123Щ'
Будет сообщение об ошибке. Почему?
Дело в том, что 'Щ' это символ, код которого состоит из двух байтов в utf-8. В других кодировках может быть по другому. Так что нужно определиться с кодировкой. И это будет выглядеть так
Результат выполнения
b'123\xd0\xa9'
49 49 0x31 0o61
50 50 0x32 0o62
51 51 0x33 0o63
208 208 0xd0 0o320
169 169 0xa9 0o251
Мы видим, что символу 'Щ' ставится в соответствие 2 байта. При этом из обычной строки мы получаем байтовую (бинарную) строку. Отметим также, что байты в бинарной строке можно записывать так \xa1, \x31 и т.д. для шестнадцатеричной формы.
Функцией, которая является обратной функции encode() является функция decode().
#!/usr/bin/python3
bt = '123ыǞȍ'
bt1 = bt.encode('utf-8')
print(bt1)
bt2 = bt1.decode('utf-8')
print(bt2)
Результат выполнения программы
b'123\xd1\x8b\xc7\x9e\xc8\x8d'
123ыǞȍ
Бинарные массивы
В принципе байтовые массивы ни чем не отличаются от байтовых строк. Единственное отличие их от байтовых строк, они изменяемы.
Для бинарной строки bt нельзя например написать
bt[1] = 5
Например
#!/usr/bin/python3
bt = '12Щщ'.encode('utf-8')
b = bytearray(bt) # байтовый массив
print(*b)
b[0] = ord('&') # меняем элемент массива
s = ''.join(b.decode('utf-8'))
print(s)
Результат выполнения
49 50 208 169 209 137
&2Щщ
Отметим, что результатом чтения из бинарного файла является является бинарная строка, соответственно и писать в файл можно бинарные строки. Мы воспользуемся сегодняшними знаниями, когда будем работать с бинарными файлами.
Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.