2016-08-28 7 views
-2

私は最近codecsモジュールで遊んでてきたと私は私はむしろ奇妙見つけるこの動作つまずい:
codecs.encode(b'a', 'hex')戻りb'61'不当な出力()

私の質問は、なぜですか?私は実際にそれがb'61'を返すとは思わなかった。私はb'\x61'を期待していた。
前者は長さ2(len(b'61') == 2)のbytesオブジェクトですが、後者は長さ1(len(b'\x61') == 1)のbytesオブジェクトです。

'hex'コーデックでエンコードすると、1バイトであると考えられるb'a'が2バイトになったため、この動作はまったく予想されませんでした。

ASCII文字を16進数でbytesという表現に変換するにはどうしましたか?私がしたことは:

codecs.decode(hex(ord('a'))[2:], 'hex') 

しかし、これはちょっと汚いハックのような感じでした。

+0

https://docs.python.org/3/library/codecs.html#binary-transforms、 "オペランドを1バイトあたり2桁の16進表記に変換する" –

+2

また、あなた自身が指摘しているように、 'b '\ x61''は' b'a'を言うもう一つの方法です。それらは**異なるバイト表現**で書かれた同じバイト列**です。 http://stackoverflow.com/questions/7784148/understanding-repr-function-in-pythonを参照してください。 –

+0

私の悪いです。 RTFMのアドバイスを教えていただきありがとうございます。 –

答えて

0

コーデックの動作は文書化されていますが、目的はバイナリデータ(おそらく)のテキスト表現を作成することです。

asciiを使用して文字 'a'をその文字のバイト表現に変換する場合は、コーデックモジュールは必要ありません。組み込みのbytesを使用してください。

>>> bytes('a','ascii') 
b'a' 

コメント欄で述べたように、B'A」はBと等しい '\ X61'

関連する問題