1

私の入力ファイルは任意である可能性があるため、使用します

f = open("in-file", 'rb')

チャンクサイズは約 4K バイトなので、

f.read(4096)

私がやりたいことは、ファイルからチャンクごとにチャンクを読み取ることです。さらに、チャンクは実際には $2^15$ ビット (4KB) のシーケンスであるため、チャンクを読み取るときは、さらに計算するためにそれを 10 進数値に変換する必要があります。

たとえば、最初のチャンクの形式が 0000...10 の場合、対応する 10 進数値 (x=2 など) を保持する別の変数が必要です。

文字列の変換からビットのリストへの変換、およびその逆のコードは、チャンクごとにチャンクを読み取るのに役立つことを知っています。

def tobits(s):
    result = []
    for c in s:
        bits = bin(ord(c))[2:]
        bits = '00000000'[len(bits):] + bits
        result.extend([int(b) for b in bits])
    return result

ただし、出力リストを10進数値に変換する方法がわかりません。誰かサンプルコードを教えてもらえますか? ありがとうございました。

4

2 に答える 2

1

http://code.activestate.com/recipes/510399-byte-to-hex-and-hex-to-byte-string-conversion/を参照すると、次のコードはおそらく高速に実行されることがわかりました。算数が含まれます。

def ByteToHex( byteStr ):
    return ''.join( [ "%02X " % ord( x ) for x in byteStr ] ).strip()

したがって、たとえば、2 バイトのチャンクを 10 進数として読み取るタスクは、次のコードで実行できます。

in_file=open("in-file", "rb")
piece = in_file.read(2)
a=ByteToHex(piece)
a=int(a,16)
于 2013-01-17T19:21:36.560 に答える
0

私が質問を正しく理解しているなら、あなたは次のようなものが欲しいです:

def bytes_to_long(bytes):
    result = 0l
    for c in bytes:
        result *= 256
        result += ord(c)
    return result

とはいえ、これはやや遅くなる可能性があり、4kBはかなり大きくlong、大量のガベージが作成されます。struct.unpack()反復ごとに複数のバイトを使用して処理することでこれを改善できる可能性がありますが、その場合は、正しいエンディアンとすべてに対処する必要があります。Python 3では、IOメソッドから型ord()を返す必要があるため、おそらく必要ありません。bytes

于 2013-01-17T17:22:38.387 に答える