2016-12-05 8 views
0

私はそれを受け入れるようにプログラムされたハードウェアに2桁の16進数のバイトを送るために、Pythonでソケットライブラリを使用しようとしています。進数字のユーザーinputed文字列からバイトを作成するために、私はbytes.fromhexを使用しようとしている()クラスメソッドは、ここで説明:なぜbytes.fromhex()はいくつかの16進値を妙に扱いますか?

https://docs.python.org/dev/library/stdtypes.html#bytes.fromhexがなぜ次ん:

hexstring = "bb 0D 02 55 55 5A ce" 
data = bytes.fromhex(hexstring) 
print(data) 

は私を与える:

b'\xbb\r\x02UUZ\xce' 

の代わり:

b'\xbb\x0d\x02\x55\x55\x5a\xce' 

そして、どうすれば2番目の出力を得ることができますか?私はPython 3.5を使用しています。

+0

' '\のx55''があります印刷可能なASCII文字「U」、「\ x5A」は印刷可能なASCII文字「Z」、および「\ x0D」は通常はエスケープ文字列「\ r」で示されるASCII文字です。 ''\ x ..''のみの形式を表示する文字列が必要な場合は、16進コードが各文字に対して明示的に表示されますが、これはすでに 'hexstring'にあります。出力文字列がPythonコンソールによってどのように*表示されるか心配する必要はありません。コンテンツを処理し、それがどのシステムに表示されるかについて心配する方がおそらく大切です。 – jez

答えて

1

これは、bytes.fromhex()とは関係ありません。あなたは、Pythonにあなたの期待結果を入力する場合は、同じ結果を得るだろう:

>>> b'\xbb\x0d\x02\x55\x55\x5a\xce' 
b'\xbb\r\x02UUZ\xce' 

可能常にASCII印刷可能な文字と短い1文字のエスケープシーケンスを使用しますbytesオブジェクトのrepr()表現。

したがって\x0dは、\rと表示されます。これは、キャリッジリターンのASCIIコードポイントであるためです。 \x55は、これはあなたのための問題である場合は、明示的に再び16進数のためにあなたのbytes値を変換する必要がありますなどの印刷可能なASCII文字U

です:

>>> b'\xbb\r\x02UUZ\xce'.hex() 
'bb0d0255555ace' 
+0

ありがとうございます。 ASCII印刷可能文字と1文字のエスケープシーケンスを使用して表示されているにもかかわらず、必要な方法でまだ送信されていることに気付きました。 – Jim

0

Pythonは、印刷可能なASCIIとして解釈できるバイトを自動的に表示します。たとえば、chr(0x55) == 'U'なので、Pythonは単に16進コードの代わりにUを出力します。それはまだ同じデータです。

関連する問題