C#读取,修改然后将二进制数据写入文件。最佳会议?

时间:2012-06-07 21:08:03

标签: c# binary bytearray

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

我正在研究的项目的目标包括:

  1. 读取二进制文件。

  2. 我知道需要读取的偏移量才能从此文件中找到特定的数据块。

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

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

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

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

  7. 现在我有我的块的起始偏移量,结束偏移量和大小。 这应该允许我从文件中读取字节到字节数组,并提前知道数组的大小。

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

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

    我陷入了几个方面:

    • 二进制阅读/写作的最佳做​​法是什么?
    • 读取数据的最佳存储惯例是什么?
    • 当我需要修改字节时,我该如何处理。
    • 我应该使用FileStream吗?

1 个答案:

答案 0 :(得分:3)

既然你想要读写,那么直接使用FileStream类是有意义的(使用FileMode.Open和FileAccess.ReadWrite)。请参阅FileStream on MSDN以获得一个很好的整体示例。

  1. 您需要知道要从流中读取的字节数。请参阅FileStream.Read documentation
  2. 从根本上说,如果您打算使用并稍后修改其内容, 可以在某些时候将字节读入内存。所以你将拥有来制作内存中的副本(如果你一次读取一个可变长度的块,使用Read方法是正确的方法)。
  3. 至于最佳做法,请在完成后随时处理您的信息流; e.g:

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

    如果你要做大量的工作,你应该异步地完成这项工作。 (如果是这种情况,请告诉我们。)

    当然,在使用这些方法之前,请检查FileStream.Read文档以及FileStream.Write documentation

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

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

    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.
    }