正确地将二进制数据转换为python中的十六进制

时间:2016-08-20 05:36:38

标签: python python-2.7 binascii

我正在开发一个程序,该程序使用BMP和透明层的单独文件。我需要将它们转换为PNG,所以我在python中使用PIL来实现。但是,我需要十六进制透明文件中的数据,以便将其添加到图像中。我正在使用binascii.hexlify函数来做到这一点。

现在,我遇到的问题是由于某种原因数据,经过hexlify函数(我通过逐段浏览我的代码系统地缩小了它),看起来与我的十六进制不同编辑器,并导致图像轻微扭曲。我似乎无法弄清楚我哪里出错了。

Data before processing in Hex editor

Data after processing in Hex editor

以下是我的代码中有问题的部分:

filename = askopenfilename(parent=root)
with open(filename, 'rb') as f:
    content = f.read()
    f.close()
hexContent = binascii.hexlify(content).decode("utf-8")

我的input

我的output(这是写入文件的十六进制内容。因为我知道在写入文件时没有出错,而且它与我的实际程序无关,所以我没有将该部分添加到代码片段)

在有人问我之前我尝试过codecs.encode(内容,'hex')和binascii.b2a_hex(内容)。

至于我怎么知道这部分搞砸了,我打印出了binascii.hexlify(内容)并找到了与hex编辑器中相同的部分,它看起来与我最终得到的相同。

出现问题的另一种可能性是“open(filename,'rb')”步骤。我还没有想过要测试它的方法。所以任何帮助或建议将不胜感激。如果您需要我用于测试目的的其中一个文件,我很乐意在这里添加一个。

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,那么您所需的输出应与Data before processing in Hex editor匹配。我可以使用以下代码获取此信息:

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

有关更详细的说明,请参阅this answer