7

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

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

H* 格式表示“十六进制字符串,高半字节优先”。

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

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

4

3 回答 3

13

使用该binascii模块有一种简单的方法:

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

除非我对半字节排序有误解(高半字节优先是默认设置……任何不同的东西都是疯狂的),那应该就足够了!

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

于 2008-10-14T14:15:26.693 回答
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]))

或者更好的是,您可以只使用十六进制编解码器。IE。

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

要解压,您可以类似地将结果编码回十六进制

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

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

>>> 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'

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

于 2008-10-14T11:59:32.960 回答
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

高温高压

于 2008-10-14T11:17:11.547 回答