使用PHP pack()函数,我已将字符串转换为二进制十六进制表示形式:
$string = md5(time); // 32 character length $packed = pack('H*', $string);
H*格式化意味着"Hex string,high nibble first".
要在PHP中解压缩,我只需使用带有H*格式标志的unpack()函数.
我如何在Python中解压缩这些数据?
使用该binascii
模块有一种简单的方法:
>>> import binascii >>> print binascii.hexlify("ABCZ") '4142435a'
除非我误解了有关半字节排序的事情(首先是高半字节是默认值),这应该是完全足够的!
此外,Python的hashlib.md5
对象有一种hexdigest()
方法可以自动将MD5摘要转换为ASCII十六进制字符串,因此MD5摘要甚至不需要此方法.希望有所帮助.
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'
[编辑]:更新后使用更好的方法(十六进制编解码器)
在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