如何在Python中解压缩二进制十六进制格式的数据?

时间:2008-10-14 11:08:07

标签: php python binary hex

使用PHP pack()函数,我已将字符串转换为二进制十六进制表示形式:

$string = md5(time); // 32 character length
$packed = pack('H*', $string);

H *格式化意味着“Hex string,high nibble first”。

要在PHP中解压缩,我只需使用带有H *格式标志的unpack()函数。

我如何在Python中解压缩这些数据?

3 个答案:

答案 0 :(得分:12)

使用binascii模块可以轻松实现此目的:

>>> import binascii
>>> print binascii.hexlify("ABCZ")
'4142435a'

除非我误解了有关半字节排序的事情(首先是高半字节是默认值),这应该是完全足够的!

此外,Python的hashlib.md5对象具有hexdigest()方法,可自动将MD5摘要转换为ASCII十六进制字符串,因此MD5摘要甚至不需要此方法。希望有所帮助。

答案 1 :(得分:11)

struct.pack没有相应的“hex nibble”代码,所以你需要先手动打包成字节,如:

hex_string = 'abcdef12'

hexdigits = [int(x, 16) for x in hex_string]
data = ''.join(struct.pack('B', (high <<4) + low) 
               for high, low in zip(hexdigits[::2], hexdigits[1::2]))

或者更好,您可以使用十六进制编解码器。即

>>> data = hex_string.decode('hex')
>>> data
'\xab\xcd\xef\x12'

要解压缩,您可以将结果编码回十六进制同样

>>> data.encode('hex')
'abcdef12'

但请注意,对于您的示例,在编码时可能根本不需要通过十六进制表示进行往返。只需直接使用md5二进制摘要即可。即

>>> x = md5.md5('some string')
>>> x.digest()
'Z\xc7I\xfb\xee\xc96\x07\xfc(\xd6f\xbe\x85\xe7:'

这相当于你的pack()ed表示。要获取十六进制表示,请使用上面相同的解包方法:

>>> x.digest().decode('hex')
'acbd18db4cc2f85cedef654fccc4a4d8'
>>> x.hexdigest()
'acbd18db4cc2f85cedef654fccc4a4d8'

[编辑]:更新为使用更好的方法(十六进制编解码器)

答案 2 :(得分:8)

在Python中,您可以使用struct模块。

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8

HTH