#python #encoding #hex
#python #кодирование #шестнадцатеричный
Вопрос:
То, что я пытаюсь сделать, это извлечь изображения png из файлов, поэтому, читая шестнадцатеричные данные, легко найти, где они скрыты. Они всегда начинаются и заканчиваются определенными значениями, относящимися к изображениям png. Я написал скрипт, который откроет файл .bin, выполнит поиск этих значений и экспортирует в формате png. Проблема в том, что в python 2.7 ничего не происходит, а в python 3 я получаю ошибки о кодировке файла. Я пробовал ignorerrors и флаги кодировки utf-8, но проблемы все еще сохраняются. Рассматриваемый код:
import binascii
import re
import os
for directory, subdirectories, files in os.walk('.'):
for file in files:
if not file.endswith('.bin'):
continue
filenumber = 0
with open(os.path.join(directory, file)) as f:
hexaPattern = re.compile(
r'(89504E47.*?AE426082)',
re.IGNORECASE
)
for match in hexaPattern.findall(binascii.hexlify(f.read())):
with open('{}-{}.png'.format(file, filenumber), 'wb ') as f:
f.write(binascii.unhexlify(match))
filenumber = 1
Итак, как вы можете видеть, извлеките шестнадцатеричные значения, начинающиеся с «89504E47» из импортированного файла, что-нибудь среднее между этим и «AE426082». Я думаю, что весь код для получения этих значений в порядке, но у меня проблемы с python, фактически считывающим файл как шестнадцатеричный. Мысли?
Комментарии:
1. » Я получаю ошибки — пожалуйста, предоставьте полную обратную трассировку ошибок. Обратите внимание, что вы открываете свой файл в текстовом режиме (по умолчанию). Начните с выполнения этого в двоичном режиме:
with open(os.path.join(directory, file), 'b') as f:
2. Вероятно, вам нужно открыть файл в двоичном режиме, чтобы избежать перевода данных в символы Юникода.
Ответ №1:
Спасибо @Thierry Lathuille, который исправил это. Я использовал python 3.9, затем внес изменения с помощью:
with open(os.path.join(directory, file), 'rb ') as f:
и все выводится правильно!