2008-10-14 83 views
6

使用PHP pack()功能,我已转换的字符串为二进制十六进制表示:如何在Python中解压二进制十六进制格式的数据?

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

的H *格式化装置“的十六进制字符串,高半字节先”。

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

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

+0

你有你的术语可怕的困惑。 – hop 2008-10-14 12:42:59

+0

@hop:除“二进制十六进制”外,其全部都可以。只有一点跨语言词汇差异。在我读到PHP的pack()的定义之前,它首先让我感到困惑,但它只是一个使用不同术语的问题。 – Brian 2008-10-14 13:16:23

回答

12

有一个简单的方法与binascii模块要做到这一点:

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

除非我误解了一些关于半字节排序的问题(高半字节先是默认值),那应该是完全足够的!

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

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

+3

注意:“h”的含义与“以十六进制编码的半字节”不同,它指的是一个16位整数。 – Brian 2008-10-14 11:55:19

11

有用于struct.pack没有相应的 “六角蚕食” 的代码,所以你要么需要手动打包成字节第一,如:

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' 

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