使用PHP pack()功能,我已转换的字符串为二进制十六进制表示:如何在Python中解压二进制十六进制格式的数据?
$string = md5(time); // 32 character length
$packed = pack('H*', $string);
的H *格式化装置“的十六进制字符串,高半字节先”。
要在PHP中解压缩,我只需使用带有H *格式标记的unpack()函数。
我该如何在Python中解压这些数据?
使用PHP pack()功能,我已转换的字符串为二进制十六进制表示:如何在Python中解压二进制十六进制格式的数据?
$string = md5(time); // 32 character length
$packed = pack('H*', $string);
的H *格式化装置“的十六进制字符串,高半字节先”。
要在PHP中解压缩,我只需使用带有H *格式标记的unpack()函数。
我该如何在Python中解压这些数据?
有一个简单的方法与binascii
模块要做到这一点:
>>> import binascii
>>> print binascii.hexlify("ABCZ")
'4142435a'
除非我误解了一些关于半字节排序的问题(高半字节先是默认值),那应该是完全足够的!
此外,Python的hashlib.md5
对象有一个hexdigest()
方法来自动将MD5摘要转换为ASCII十六进制字符串,以便此方法甚至不是MD5摘要所必需的。希望有所帮助。
有用于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'
[编辑]:更新后可使用更好的方法(十六进制编码解码器)
你有你的术语可怕的困惑。 – hop 2008-10-14 12:42:59
@hop:除“二进制十六进制”外,其全部都可以。只有一点跨语言词汇差异。在我读到PHP的pack()的定义之前,它首先让我感到困惑,但它只是一个使用不同术语的问题。 – Brian 2008-10-14 13:16:23