簡體   English   中英

如何在 Python 中解壓二進制十六進制格式的數據?

[英]How can I unpack binary hex formatted data in Python?

使用 PHP pack()函數,我已將字符串轉換為二進制十六進制表示:

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

H* 格式的意思是“十六進制字符串,高位先行”。

要在 PHP 中解壓縮它,我只需使用帶有 H* 格式標志的unpack()函數。

我將如何在 Python 中解壓這些數據?

使用binascii模塊有一種簡單的方法可以做到這一點:

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

除非我對半字節排序有誤解(默認高半字節優先……任何不同都是瘋狂的),這應該是完全足夠的!

此外,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'

[編輯]:更新為使用更好的方法(十六進制編解碼器)

在 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM