【问题标题】:How can I unpack binary hex formatted data in Python?如何在 Python 中解压缩二进制十六进制格式的数据?
【发布时间】:2010-09-17 01:49:32
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的术语非常混乱。
  • @hop: 除了“binary hex”,其他都可以。只是跨语言词汇有一点差异。起初我很困惑,直到我阅读了 PHP 的 pack() 的定义,但这只是使用不同术语的问题。

标签: python binary hex


【解决方案1】:

binascii 模块有一个简单的方法:

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

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

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

【讨论】:

    【解决方案2】:

    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'
    

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

    【讨论】:

    • 在第一个版本中,使用group语句有什么特别需要导入的吗?
    • @Leandro:糟糕——group() 是我自己库中的一个函数(将一个序列分成 N 个字符组)。我已经更新了代码,只使用一个切片来避免未定义的函数。
    【解决方案3】:

    在 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

    【讨论】:

    • 注意:“h”在结构中的含义不同于“半字节编码为十六进制”——它指的是一个 16 位整数。
    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 2023-03-05
    • 2021-05-27
    • 2021-11-20
    • 2016-11-01
    • 2019-03-07
    • 1970-01-01
    • 2020-05-09
    相关资源
    最近更新 更多