Найти в Дзене
programmer's notes (python and more)

Стандартные библиотеки в Python. Файлы прямого доступа. Алгоритм поиска в двоичном файле

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Пример поиска байтовой строки в файле

Сегодня практический пример и относиться к управлению двоичными файлами. Статья по сути относится к подборке

Python, управление файлами | programmer's notes | Дзен

Я давно обещал написать об этом, но увлёкся библиотекой os. А материалы по os ещё не закончились и я решил не много отвлечься.

О чём собственно речь. Есть двоичный файл произвольной длины. Нужно найти первое вхождение данной байтовой строки. Т.е. программа должна выдать смещение строки от начала файла или -1 если строка не найдена. Есть один важный момент. Файл может быть очень длинным и считывание его в переменную будет не рационально. Значит нужно считывать порциями и искать в каждой порции отдельно.

И так читать придётся последовательно в буфер и искать в нём. Ну сам поиск не сложный, можно и для байтовой строки использовать известные методы, в частности find(). Но есть один нюанс. Искомая строка может оказаться на стыке между двумя частями файла, попадающими в разные буферы. Решить эту проблему не сложно. После очередного чтения в буфер и поиске в нём нужно просто сдвинуть указатель в сторону начала файла на длину байтовой строки. При этом, конечно, длина буфера должна быть больше длины строки.

Описанный словесно алгоритм представлен в программе ниже.

Текст программы см. ниже
Текст программы см. ниже
primer72.py

Ну а в заключении приведу пример программы вывода содержимого файла в виде таблицы байтов в шестнадцатеричном представлении. Программа может вам пригодиться для работы с двоичными файлами.

Текст программы см. ниже
Текст программы см. ниже
primer73.py

Фрагмент вывода программы

Пример вывода программы
Пример вывода программы

Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Ну знаете ли, это вам не байты по архивам тырить
Ну знаете ли, это вам не байты по архивам тырить