3

我一般是编程新手(我对编程概念的理解仍在增长。)。所以这个问题是关于学习的,所以请提供足够的信息让我学习,但不要太多,我不能,谢谢。(我还想了解如何使代码在项目中可重用。)

我正在从事的项目的目标包括:

  1. 读取二进制文件。

  2. 我知道我需要读取的偏移量以从该文件中查找特定的数据块。

  3. 第一个偏移量是前 4 个字节(我的块末尾的偏移量)。

  4. 第二个偏移量是从文件末尾开始的 16 个字节。我读了 4 个字节。(以十六进制给出块的大小)。

  5. 第三个偏移量是前一个字节后的 4 个字节,读取 4 个字节(十六进制块开始的偏移量)。

  6. 通过搜索 ASCII 文本和偏移量来定位块中要修改的部分。

现在我有了我的块的开始偏移量、结束偏移量和大小。这应该允许我将文件中的字节读入字节数组并提前知道数组的大小。

(问题:1. 知道大小重要吗?除了验证。2. 将文件的一部分读入字节数组以更改字节并覆盖文件的那部分是最好的方法吗?)

到目前为止,我已经设法在 MemoryStream 上使用 BinaryReader 从文件中读取偏移量。然后我找到我需要的数据块并将其读入一个字节数组。

我被困在几个方面:

  • 二进制读/写的最佳实践是什么?
  • 读取数据的最佳存储约定是什么?
  • 当我需要修改字节时,我该怎么做。
  • 我应该使用 FileStream 吗?
4

1 回答 1

3

由于您既要读取又要写入,因此直接使用 FileStream 类(使用 FileMode.Open 和 FileAccess.ReadWrite)是有意义的。请参阅MSDN 上的 FileStream 以获得一个很好的整体示例。

  1. 您确实需要知道将从流中读取的字节数。请参阅FileStream.Read 文档
  2. 从根本上说,如果您要使用并稍后修改它们的内容,则必须在某个时候将字节读入内存因此,您必须制作一个内存副本(如果您一次读取可变长度的块,则使用 Read 方法是正确的方法)。

至于最佳实践,请务必在完成后处理您的流;例如:

using (var stream = File.Open(FILE_NAME, FileMode.Open, FileAccess.ReadWrite))
{
    //Do work with the FileStream here.
}

如果你要做大量的工作,你应该异步地做这些工作。(让我们知道是否是这种情况。)

当然,在使用这些方法之前,请查看 FileStream.Read 文档和FileStream.Write 文档。

读取字节最好通过预先分配一个内存中的字节数组来完成,该数组具有您要读取的长度,然后读取这些字节。以下将读取您感兴趣的字节块,让您对其进行处理,然后替换原始内容(假设块的长度没有改变):

编辑:根据对变量范围的评论,我添加了一个辅助方法来处理块。

using (var stream = File.Open(FILE_NAME, FileMode.Open, FileAccess.ReadWrite))
{
    var chunk = new byte[numOfBytesInChunk];
    var offsetOfChunkInFile = stream.Position; // It sounds like you've already calculated this.
    stream.Read(chunk, 0, numOfBytesInChunk);

    DoWorkOnChunk(ref chunk);        

    stream.Seek(offsetOfChunkInFile, SeekOrigin.Begin);
    stream.Write(chunk, 0, numOfBytesInChunk);
}

private void DoWorkOnChunk(ref byte[] chunk)
{
    //TODO: Any mutation done here to the data in 'chunk' will be written out to the stream.
}
于 2012-06-07T23:20:35.053 回答