Правильное преобразование двоичных данных в шестнадцатеричный в Python

python python-2.7 binascii

585 просмотра

1 ответ

Я работаю над программой, которая использует 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')". Я еще не придумал, как это проверить. Так что любая помощь или предложения будут оценены. Если вам понадобится один из файлов, которые я использую для тестирования, я с удовольствием добавлю его сюда.

Автор: Yascob Источник Размещён: 08.11.2019 10:56

Ответы (1)


0 плюса

Если я правильно понимаю ваш вопрос, то желаемый результат должен соответствовать данным перед обработкой в ​​шестнадцатеричном редакторе . Я могу получить это с помощью следующего кода:

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

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

Автор: FujiApple Размещён: 21.08.2016 10:18
Вопросы из категории :
32x32