PHP で書かれた認証ライブラリを Python に翻訳しています。それはすべてレガシーコードであり、元の開発者はずっと前にいなくなっています。彼らは、PHP の「pack」コマンドを使用して、「H」フラグを使用して文字列を 16 進数に変換しました。PHP のドキュメントでは、これを「16 進文字列、上位ニブルが最初」と説明しています。binascii.unhexlify() の使用を提案した別の質問 ( PHP パックに相当する Python)を読みましたが、16 進数以外の文字を渡すたびに文句を言います。
だから私の質問は、PHP パック関数は 16 進数以外の文字で何をするのですか? それらを破棄しますか、それとも翻訳を実行する余分なステップがありますか。Python で binascii.unhexlify よりも優れた方法はありますか?
'H*' をパッキング
php -r 'print pack("H*", md5("Dummy String"));'
戻り値
??????=?PW??
パイソンでは:
secret = binascii.unhexlify( "Dummy String" )
TypeError: Non-hexadecimal digit found
助けてくれてありがとう。
[編集]
したがって、DJV は基本的に正しかったのです。最初に値を md5 に変換する必要がありましたが、ここが興味深いところです。Python では、md5 ライブラリは「ダイジェスト」メソッドを介してバイナリ データを返します。
私の場合、すべての binascii 呼び出しをスキップして、単に使用することができました
md5.md5('Dummy String').digest()
PHP では次のようになります。
pack("H*", md5("ダミー文字列"));
楽しいもの。知っておくと良い。