Правильное преобразование двоичных данных в шестнадцатеричный в Python
Я работаю над программой, которая использует BMP и отдельный файл для слоя прозрачности. Мне нужно преобразовать их в PNG, поэтому для этого я использую PIL в python. Однако мне нужны данные из файла прозрачности в шестнадцатеричном формате, чтобы их можно было добавить к изображению. Я использую функцию binascii.hexlify, чтобы сделать это.
Теперь проблема, с которой я сталкиваюсь, заключается в том, что по какой-то причине данные, пройдя через функцию hexlify (я систематически сужал ее, просматривая фрагмент кода), выглядят иначе, чем в моем редакторе hex и вызывая небольшие искажения на изображениях. Я не могу понять, где я иду не так.
Данные перед обработкой в шестнадцатеричном редакторе
Данные после обработки в шестнадцатеричном редакторе
Вот проблемная часть моего кода:
filename = askopenfilename(parent=root)
with open(filename, 'rb') as f:
content = f.read()
f.close()
hexContent = binascii.hexlify(content).decode("utf-8")
Мой вклад
Мой вывод (это шестнадцатеричное содержимое, записанное в файл. Так как я знаю, что при записи файла это не так, и это также не имеет отношения к моей реальной программе, я не добавил эту часть в фрагмент кода)
Прежде чем кто-либо спросит, я попробовал codecs.encode(content, 'hex') и binascii.b2a_hex(content).
Что касается того, что я знаю, что эта часть не работает, я распечатал binascii.hexlify(content) и нашел ту же часть, что и в шестнадцатеричном редакторе, и она выглядела идентично тому, что я получил в конце.
Другая возможность, где это происходит не так, на шаге "open(filename, 'rb')". Я еще не придумал, как это проверить. Так что любая помощь или предложения будут оценены. Если вам понадобится один из файлов, которые я использую для тестирования, я с удовольствием добавлю его сюда.
1 ответ
Если я правильно понимаю ваш вопрос, то желаемый результат должен соответствовать данным перед обработкой в шестнадцатеричном редакторе. Я могу получить это с помощью следующего кода:
with open('Input.alp', 'rb') as f:
i = 0
for i, chunk in enumerate(iter(lambda: f.read(16), b'')):
if 688 <= i * 16 <= 736:
print i * 16, chunk.encode('hex')
Выходы:
688 ffffffffffffffffffffffffffffffff
704 ffffffffffffffffffffffe000000000
720 000000000000000001dfffffffffffff
736 ffffffffffffffffffffffffffffffff
Смотрите этот ответ для более подробного объяснения.