20

いくつかのPythonコードを調べてみると、16進値にはさまざまな表現があることに気づきました。たとえば、次のような番号を選択した場合:

xx = '\x03\xff'

次に、次のコマンド(リトルエンディアンをビッグエンディアンに変換するために使用しているバージョン)

yy = hex(struct.unpack('>H', xx)[0])

戻ります:

'0x3ff'

ただし、このコマンド

zz = xx.encode('hex')

戻ります:

'03ff'

最後に、値だけを出力すると、これが返されます

'\x03\xff'

その見た目から、3つの異なるタイプのヘックスがあります。

  1. '\xFF'
  2. '0xFF'
  3. 'FF'

違いは何ですか?

誰かがリトルエンディアンをビッグエンディアンの数値に変換するためのより良い方法を提案できる場合は、ボーナスポイントがあります。上記の方法はyy、2バイトを超える数値では十分に機能せず、16バイトの長さの16進文字列(ASCII /整数値に対応しない値を含む)で作業しています。

4

2 に答える 2

9

使用して\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'
于 2012-10-29T15:09:44.030 に答える
2

'\ xFF'は、ASCIIコード255の文字を含む文字列を表します。

例: print '\x41'「A」を指定します(これはASCIIコード41の文字であるため)

そして、文字列xxに含まれるASCIIコードの人間が読める16進表現を提供しますxx.encode('hex')hex(struct.unpack('>H', xx)[0])これは、結果の文字列にaとfまたは0と9の間の文字数が含まれていることを意味します。

于 2012-10-29T15:00:42.273 に答える