Pythonでバイナリ16進形式のデータをアンパックするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/200738

  •  03-07-2019
  •  | 
  •  

質問

PHP pack()関数を使用して、文字列を16進数のバイナリ表現に変換しました。

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

H *フォーマットは、「16進文字列、上位ニブルが最初」という意味です。

これをPHPでアンパックするには、H *形式の unpack()関数を使用するだけですフラグ。

このデータをPythonで解凍するにはどうすればよいですか

役に立ちましたか?

解決

binascii モジュールでこれを行う簡単な方法があります:

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

ニブルの順序について誤解していない限り(最初にハイニブルがデフォルトです)、それで十分です!

さらに、Pythonの hashlib.md5 オブジェクトには hexdigest()メソッドがあり、MD5ダイジェストをASCII 16進文字列に自動的に変換するため、このメソッドは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]))

さらに良いのは、16進コーデックを使用するだけです。すなわち。

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

解凍するには、同様に結果を16進数にエンコードして戻すことができます

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

ただし、あなたの例では、エンコード時に16進表現を往復する必要はおそらくないことに注意してください。 md5バイナリダイジェストを直接使用するだけです。すなわち。

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

これはpack()ed表現と同等です。 16進表現を取得するには、上記と同じunpackメソッドを使用します:

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

[編集]:より良い方法を使用するように更新(16進コーデック)

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帰属
所属していません StackOverflow
scroll top