0

バイナリモードを使用してPythonでファイル(ディスクイメージと/ dev / sdaなど)を読み取っています。私は最初のセクター(512バイト)を読んでいて、ディスク情報を印刷しようとしています(参照:ウィキペディアの記事)。

パーティション内の最初の絶対セクターの32ビットLBAのようなものを解釈するために、私は次のようなことをしています-

def int32(bytes):
    return int(bytes[3]<<24|bytes[2]<<16|bytes[1]<<8|bytes[0])

def int16(bytes):
    return int(bytes[1]<<8|bytes[0])

print('LBA:',int32(partitionEntry[8:12]))

Pythonでこれを行うためのネイティブワットはありますか?intVar=(int*)someBasePointerCでの型キャストとして


回答済みとしてマークした後に追加:

奇数ビット構造に対してこれを行う方法はありますか?CHSのように。C(シリンダー)は、一方のバイトから8ビット、もう一方のバイトから2ビットの10ビットです。これに対する私の現在のアプローチは

def getCHS(bytes):
    c=bytes[1]&3<<8|bytes[2]
    h=bytes[0]
    s=bytes[1]&63
    return {'c':c,'s':s,'h':h}
4

2 に答える 2

4

関数が必要ですstruct.unpack()

import struct

def int32(some_bytes):
    return struct.unpack("i", some_bytes)[0]

def int16(some_bytes):
    return struct.unpack("h", some_bytes)[0]

現在のシステムとは異なるエンディアン値を使用するシステムから読み取る場合は、フォーマット文字列でもエンディアンを指定する必要がある場合があります。

iおよびhはsigned intバージョンです。unsignedが必要な場合は、およびを使用IしてくださいH

于 2012-10-20T18:16:06.770 に答える
3

単純な1バイト、2バイト、または4バイトのフィールドの場合、最善の策はですstruct.unpack。次のようなものを試してください:

def int32(bytes):
    return struct.unpack("i", bytes[:4])[0]

フォーマット文字列で、"<i"またはとしてエンディアンを指定する必要がある場合があります。">i"

ただし、より異常なフィールド幅では、マスキングやビットシフトが必要です。あなたのアプローチはうまくいきます。または、十分なサイズの符号なしタイプを解凍することもできますが、多くの作業を節約することはできません。

def getCHS(bytes):
    h, r = struct.unpack("BH", bytes[:3])
    c = r & 0x3F
    s = r >> 10
    return {'c':c,'s':s,'h':h}
于 2012-10-20T18:16:36.193 に答える