代码之家  ›  专栏  ›  技术社区  ›  davidmytton

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

  •  6
  • davidmytton  · 技术社区  · 16 年前

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

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

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

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

    如何在python中解包这些数据?

    3 回复  |  直到 7 年前
        1
  •  12
  •   Dan Lenski    16 年前

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

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

    除非我对咬入顺序有误解(默认情况下是先高咬入),否则这就足够了!

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

        2
  •  11
  •   community wiki 8 revs Brian    15 年前

    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'
    

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

        3
  •  8
  •   Tagar    7 年前

    在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
    

    高温高压