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

发布于 2024-07-08 07:56:34 字数 379 浏览 5 评论 0原文

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

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

H* 格式意思是“十六进制字符串,高半字节在前”。

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

我如何用 Python 解压这些数据?

Using the PHP pack() function, I have converted a string into a binary hex representation:

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

The H* formatting means "Hex string, high nibble first".

To unpack this in PHP, I would simply use the unpack() function with the H* format flag.

How would I unpack this data in Python?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦归所梦 2024-07-15 07:56:35

有一个简单的方法可以使用 binascii 模块来做到这一点:

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

除非我误解了半字节顺序(高半字节在前是默认的......任何不同都是疯狂的),这应该足够了!

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

There's an easy way to do this with the binascii module:

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

Unless I'm misunderstanding something about the nibble ordering (high-nibble first is the default… anything different is insane), that should be perfectly sufficient!

Furthermore, Python's hashlib.md5 objects have a hexdigest() method to automatically convert the MD5 digest to an ASCII hex string, so that this method isn't even necessary for MD5 digests. Hope that helps.

美胚控场 2024-07-15 07:56:35

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]))

或者更好,您可以只使用十六进制编解码器。 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'

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

There's no corresponding "hex nibble" code for struct.pack, so you'll either need to manually pack into bytes first, like:

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]))

Or better, you can just use the hex codec. ie.

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

To unpack, you can encode the result back to hex similarly

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

However, note that for your example, there's probably no need to take the round-trip through a hex representation at all when encoding. Just use the md5 binary digest directly. ie.

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

This is equivalent to your pack()ed representation. To get the hex representation, use the same unpack method above:

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

[Edit]: Updated to use better method (hex codec)

嘿哥们儿 2024-07-15 07:56:35

在 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

华泰

In Python you use the struct module for this.

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文