【问题标题】:Converting binary data to hex in python properly在python中正确将二进制数据转换为十六进制
【发布时间】:2016-08-20 05:36:38
【问题描述】:

我正在开发一个程序,该程序使用 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(这是写入文件的十六进制内容。由于我知道写入文件不会出错,并且与我的实际程序无关,因此我没有将那部分添加到代码中sn-p)

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

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

出错的另一种可能性是在“打开(文件名,'rb')”步骤中。我还没有想到一种方法来测试它。因此,任何帮助或建议将不胜感激。如果您需要我用于测试的文件之一,我很乐意在此处添加一个。

【问题讨论】:

    标签: python python-2.7 binascii


    【解决方案1】:

    如果我正确理解您的问题,那么您所需的输出应该与 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了解更详细的说明。

    【讨论】:

    • 是的,你理解正确。很抱歉以令人困惑的方式写它。我会试试这个方法,看看它是否能解决我的问题。
    猜你喜欢
    • 2016-09-15
    • 2012-06-26
    • 1970-01-01
    • 2020-04-28
    • 2016-08-28
    • 2013-07-25
    相关资源
    最近更新 更多