0

FileStreamからのオフセットがある場合、バイトを削除してから、例を書き直すにはどうすればよいですか。

Offset  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
DB0     00 00 00 00 00 00 01(byte to delete) 00 .......

私はこれを試しましたが失敗しました:

byte[] newFile = new byte[fs.Length];
fs.Position = 0;
fs.Read(newFile, 0, va -1);
fs.Position = va + 1;
fs.Read(newFile, 0, va + 1);
fs.Close();
fs.Write(newFile, 0, newFile.Length);

ここで、vaはDB5と同じです

4

1 に答える 1

2

コードにはいくつかの間違いがあります:

// the buffer should be one byte less than the original file
byte[] newFile = new byte[fs.Length - 1];
fs.Position = 0;
// you should read "va" bytes, not "va-1" bytes
fs.Read(newFile, 0, va);
fs.Position = va + 1;
// you should start reading into positon "va", and read "fs.Length-va-1" bytes
fs.Read(newFile, va, fs.Length - va - 1);
fs.Close();
fs.Write(newFile, 0, newFile.Length);

ただし、この方法の使用Read方法は信頼できませんこのメソッドは、実際には要求よりも少ないバイトを読み取ることができます。実際に読み取られたバイト数であるメソッド呼び出しからの戻り値を使用し、必要なバイト数が得られるまでループする必要があります。

byte[] newFile = new byte[fs.Length - 1];
fs.Position = 0;
int pos = 0;
while (pos < va) {
  int len = fs.Read(newFile, pos, va - pos);
  pos += len;
}
fs.Position = va + 1;
int left = fs.Length - 1;
while (pos < left) {
  int len = fs.Read(newFile, pos, left - pos);
  pos += len;
}
fs.Close();
fs.Write(newFile, 0, newFile.Length);
于 2012-10-27T16:50:24.860 に答える