8

Python を使用してバイナリ ファイルを読み込もうとしています。ファイルは LSB モードです。struct モジュールをインポートし、次のように unpack を使用します。

f=open(sys.argv[1],'rb')
contents= unpack('<I',f.read(4))[0]
print contents
f.close()

ファイル内のデータは LSB モードで 0XC0000500 であり、実際の値は 0X000500C0 です。したがって、LSB モードの最小サイズはバイト単位であることがわかります。

ただし、おそらくgccまたはマシンのバージョンが原因で、Macマシンを使用しています(確かではありません。sizeofとsys.htmlについてhttp://docs.python.org/library/struct.htmlを読んだだけです。 bitorder)、上記のコードの結果は X0500C000 であるため、LSB モードのサイズは 2 バイトです。

この問題を解決するにはどうすればよいですか?

この質問に答えがあるかどうかに関係なく、私は掘り続けます。何かを得たら更新します。

ps: データ ファイルは 32 ビット マシン用の ELF ファイルです。

pps: 膨大な量のデータを読み取るので、これは読み取りの一般的な問題であるため、手動の方法は私にとって最適ではありません。質問はまだ答えを待っています。

ppps: < は「リトルエンディアン、標準サイズ (16 ビット)」を意味します。

4

1 に答える 1

6

実際の値が OXABCD の場合、ファイルには DCBA が格納されます。

通常、バイト順序は、バイト内の個々のビットではなく、バイトの順序を定義します。 "\xDC\xBA"2 バイト (16 ビット) です。バイトを交換すると; 考えられるすべての結果は次のとおりです。

>>> "0X%04X" % struct.unpack("<H", binascii.unhexlify("DCBA"))
'0XBADC'
>>> "0X%04X" % struct.unpack(">H", binascii.unhexlify("DCBA"))
'0XDCBA'

リトルエンディアン/ビッグエンディアン形式では次の0xabcdようになります。

>>> struct.pack('<H', 0xabcd)
'\xcd\xab'
>>> struct.pack('>H', 0xabcd)
'\xab\xcd'

取得するに0XABCDは、半バイト(4 ビット)"\xDC\xBA"をスワップする必要があります。珍しいようです。

膨大な量のデータを読み取るので

arrayモジュールを使用して、一度に複数の値を読み取ることができます。モジュールと同じ型フォーマットを使用しstructます。

< は「リトルエンディアン、標準サイズ (16 ビット)」を意味します。

<>モジュールで使用する場合struct、標準サイズは固定され、何にも依存しません。標準サイズは書式文字のみに依存します。特に'<H'常に 2 バイト (16 ビット) で'<I'あり、常に 4 バイト (32 ビット) です。プレフィックスのみ@がネイティブ サイズを使用します。

古い答え

コメントが意味を成すようにここに残してください

2 バイト値として読み取り、手動で int に変換できます。

>>> hi, lo = struct.unpack("<HH", "\x05\x00\xC0\x00")
>>> n = (hi << 16) | lo
>>> n
327872
>>> "0X%08X" % n
'0X000500C0'
于 2012-08-28T16:34:22.210 に答える