Правильное преобразование двоичных данных в шестнадцатеричный в 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

Смотрите этот ответ для более подробного объяснения.

Другие вопросы по тегам