如何在Python3中将PNG数据的hexdump字符串转换为二进制?

如何在Python3中将PNG数据的hexdump字符串转换为二进制?,python,python-3.x,binary,png,hexdump,Python,Python 3.x,Binary,Png,Hexdump,我有一个小PNG文件的hexdump字符串,我想将其转换为二进制,以便写出PNG文件: clip = "0x89 0x50 0x4e 0x47 0xd 0xa 0x1a 0xa 0x0 0x0 0x0 0xd 0x49 0x48 0x44 0x52 0x0 0x0 0x0 0x8 0x0 0x0 0x0 0x7 0x8 0x2 0x0 0x0 0x0 0xba 0x3b 0x9b 0x9 0x0 0x0 0x0 0x3 0x73 0x42 0x49 0x54 0x8 0x8 0x8 0xdb 0

我有一个小PNG文件的hexdump字符串,我想将其转换为二进制,以便写出PNG文件:

clip = "0x89 0x50 0x4e 0x47 0xd 0xa 0x1a 0xa 0x0 0x0 0x0 0xd 0x49 0x48 0x44 0x52 0x0 0x0 0x0 0x8 0x0 0x0 0x0 0x7 0x8 0x2 0x0 0x0 0x0 0xba 0x3b 0x9b 0x9 0x0 0x0 0x0 0x3 0x73 0x42 0x49 0x54 0x8 0x8 0x8 0xdb 0xe1 0x4f 0xe0 0x0 0x0 0x0 0x29 0x49 0x44 0x41 0x54 0x8 0x5b 0x63 0xfc 0xff 0xff 0x3f 0x3 0x36 0xc0 0x84 0x4d 0x10 0x24 0x46 0x2b 0x89 0xf7 0x1f 0xfe 0xfd 0xfc 0x9 0x75 0xb 0x8a 0x1d 0x39 0x95 0x9f 0xef 0x3e 0xfc 0xb 0x71 0xe 0x0 0xfc 0x18 0xd 0x6c 0xa9 0xf7 0x56 0x2d 0x0 0x0 0x0 0x0 0x49 0x45 0x4e 0x44 0xae 0x42 0x60 0x82 "
我尝试过使用
clip.encode(“hex”)
但出现了错误

'hex' is not a text encoding
使用
binascii.unexlify(clip)
,我得到

Odd-length string
如果我删除空白,错误是

Non-hexadecimal digit found

SO或更广泛的互联网上的其他讨论都没有帮助。

您可以使用python的内置
eval
函数将字符串中的每个元素计算为整数。 然后在python2.7中,可以使用内置的
chr
将整数转换为字节: 在python3中,可以使用内置的
字节
转换

>>> clip = clip[:-1] # Remove last space in your clip-string
>>> hex_list = clip.split(' ') # Convert your string to list of hex-characters
# FOR PYTHON3:
>>> byte_string = bytes([eval(h) for h in hex_list])
# FOR PYTHON2.7:
>>> byte_list = [chr(eval(h)) for h in hex_list]
>>> byte_string = ''.join(byte_list) # Convert to string
>>> byte_string
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x08\x00\x00\x00\x07\x08\x02\x00\x00\x00\xba;\x9b\t\x00\x00\x00\x03sBIT\x08\x08\x08\xdb\xe1O\xe0\x00\x00\x00)IDAT\x08[c\xfc\xff\xff?\x036\xc0\x84M\x10$F+\x89\xf7\x1f\xfe\xfd\xfc\tu\x0b\x8a\x1d9\x95\x9f\xef>\xfc\x0bq\x0e\x00\xfc\x18\rl\xa9\xf7V-\x00\x00\x00\x00IEND\xaeB`\x82'

您是否尝试过这里的解决方案:@user5173426我见过它,但除了使用
binascii.unhexlify()
没有太多意义,似乎不适用于我的情况。谢谢,这几乎有效!如果我复制并粘贴代码生成的
byte\u字符串
值,并在前面加上“b”,如:
b'\x89PNG…“
,然后写出值,我会得到一个有效的PNG文件。但我还不能进行变量转换。尝试了
字节(byte\u string)
,尝试了十六进制编码,没有任何效果。我一定错过了什么明显的。。。如何将
byte\u字符串
变量转换为正确的字节格式?我不太明白您所说的变量转换是什么意思?在python2.7(我使用过)中,字符串实际上是字节字符串。在python3中,您应该使用字节([eval(h)表示十六进制列表中的h])代替python3的开头,如果我编码,我会得到
b”\xc2\x89PNG\r\n\x1a\n\x00…
什么是
\xc2
位?然后,我注意到在接近末尾时,可能在整个值中都有类似的添加。等等,刚刚注意到你的编辑<代码>字节([hex_列表中h的eval(h)]也不起作用。我没有得到有效的PNG文件。我们在Py 2.7和3方法中存在冲突。。。我对标题进行了编辑,以明确Python 3的要求。byte_string=bytes([eval(h)在hex_列表中表示h])不会提供与我的答案相同的byte_字符串吗?对我来说,在蟒蛇3中是这样的