使用して\x
いるものはすべて文字列エスケープコードであり、たまたま16進表記を使用しています。他のエスケープコードには\n
、改行、\'
リテラル引用符などが含まれます。Python文字列はバイトのシーケンスであり、そのような文字を使用してASCII印刷可能範囲外のリテラル値を指定できます。Pythonがインタプリタで文字列値をエコーバックする場合、またはrepr()
文字列に対する呼び出しの結果を出力する場合、Pythonはそのようなエスケープを使用して、代わりにASCII文字として印刷できないバイトを表します。
>>> chr(65)
'A'
>>> chr(11)
'\x0b'
この関数は、前者にプレフィックスが含まれているという違いとhex()
同様に、非常に具体的な文字列表現を返します。このような文字列表現を生成するには、さらに2つの方法があります。表現に小文字または大文字を使用する文字列フォーマッタと文字列フォーマッタを使用します。.encode('hex')
0x
'%x'
'%X'
>>> hex(11)
'0xb'
>>> '\x0b'.encode('hex')
'0b'
>>> '%x' % (11,)
'b'
>>> '%X' % (11,)
'B'
str(number)
ただし、これらはすべて文字列表現(一連のASCII文字)であり、元のデータと整数データとの関係は同じです。タイプを変更し、バイト順序を変更するという目標からさらに離れています。
バイナリ情報をリトルエンディアンからビッグエンディアンに変更するには、その情報のサイズを知っている必要があります。短い整数だけの場合は、2バイトごとに反転する必要がありますが、通常の(長い)整数の場合は、値ごとに4バイトあり、4バイトごとに反転する必要があります。
モジュールを使用するstruct
ことは、値の型を指定する必要があるため、優れたアプローチだと思います。xx
以下は、ビッグエンディアンのunsigned short intとして解釈し、それをリトルエンディアンのunsignedshortintとしてバイナリ表現にパックバックします。
>>> import struct
>>> xx = '\x03\xff'
>>> struct.pack('<H', *struct.unpack('>H', xx))
'\xff\x03'