ランダムな順序で到着する断片でバイナリ ファイルをコンパイルする必要があります (はい、P2P プロジェクトです)。
def write(filename, offset, data)
file.open(filename, "ab")
file.seek(offset)
file.write(data)
file.close()
ファイルへのオフセット1MBで32KBの書き込み(f、o、d)があり、次にオフセット0で別の32KBの書き込み(f、o、d)があるとします
最終的に 65KB の長さのファイルになります (つまり、32KB と 1MB の間の 0 で構成されるギャップは切り捨てられます/消えます)
これは信じられないほどばかげた質問に見えるかもしれませんが、file.open(..)モードからは理解できないようです
ありがたいアドバイスをいただきました。
*** アップデート
P2P作品を書く私の方法は次のようになりました(そこから何らかの価値を得るかもしれない人のために)
def writePiece(self, filename, pieceindex, bytes, ipsrc, ipdst, ts):
file = open(filename,"r+b")
if not self.piecemap[ipdst].has_key(pieceindex):
little = struct.pack('<'+'B'*len(bytes), *bytes)
# Seek to offset based on piece index
file.seek(pieceindex * self.piecesize)
file.write(little)
file.flush()
self.procLog.info("Wrote (%d) bytes of piece (%d) to %s" % (len(bytes), pieceindex, filename))
# Remember we have this piece now in case duplicates arrive
self.piecemap[ipdst][pieceindex] = True
file.close()
注: struct.pack を使用して、しばらく悩まされていたいくつかのエンディアンの問題にも対処しました。
不思議に思っている人のために、私が取り組んでいるプロジェクトは、ネットワークから直接キャプチャされた BT メッセージを分析することです。