加快将文件读取到多个字节数组并通过if语句复制偏移量

时间:2014-05-26 22:26:08

标签: c# bytearray

我使用下面的代码将任何文件转换为字节数组,然后在数组偏移搜索后将其转换为另一个字节数组。

如何使用加速读取文件到字节数组以使我的代码优化/更快,并在此while循环中。如果我搜索偏移包含的内容,我怎么能创建多个字节数组?

例如:
我打开的文件完全加载到内存使用缓冲区是好的,当我加载一个大文件+ 50MB ??或者我可以搜索其他内容。

另一件事:帮助在while循环中创建if语句来搜索ex的偏移量100是否包含字节“00110011 ” 如果是>>>将偏移量复制到其他字节数组 这是代码

 System.IO.FileStream fs = new System.IO.FileStream(openFileDialog1.FileName, System.IO.FileMode.Open);
  byte[] buf = new byte[102400];
  int bytesRead;

        // Read the file 100Kb at a time.

        do
        {

        bytesRead = fs.Read(buf, 0, 102400);



        string s = string.Join(" ", buf.Select(x => Convert.ToString(x, 2).PadLeft(8, '0')));

            MessageBox.Show("OK", "OK", MessageBoxButtons.OK);



           textBox1.Text = textBox1.Text + s;
        }

        while (bytesRead == 102400);

        fs.Close();

1 个答案:

答案 0 :(得分:0)

你可能已经陷入了"我使用了字节和数组,因此我处于低级别,所以代码会很快"陷阱。 C#和.NET为其用户提供了有效的抽象来避免这种情况,在这种情况下可能是BinaryReader及其ReadString方法。

您的代码存在问题:

  • 你没有读完整个文件(你在1048576字节的最后一个缓冲区停止,下一个x字节不会被读取)
  • 你读取一个字节数组然后将其转换为字符串?您应该使用.NET framework IO API(Streams)并直接分配字符串
  • 您应该将IO操作封装在'中使用'声明以避免资源泄漏(在文件句柄上)。

我看到的性能问题:

  • 无用的大字节数组的分配
  • 转换可以避免的电话

代码示例(我没有编译它,但它为您提供了干净,高效的文件读取的想法,请参阅我的MSDN链接以获取更多示例)

string myText = string.Empty;
using(var reader = new BinaryReader(openFileDialog1.FileName))
{
  string line;
  while((line = reader.ReadString()) != null)
  {
    myText += YouLogic(line); // use a StringBuilder if the number of string concatenations is high
  }
}

作为旁注,对于非常大的文件,请考虑使用C# Memory Mapped Files

编辑: BinaryReader包含所有所需数据类型的Read方法,它应该允许您有效地读取任何类型的二进制文件。

至于您的其他问题,请查看来自MSDN的ReadBytes

//Offset 100 bytes:
var offsetRead = reader.ReadBytes(100);
// read one byte
byte readByte = reader.ReadByte();
// compare it to the expected value
if(readByte == myByte)
{
   // copy the offset read
   var myArray = new byte[100];
   Array.Copy(offsetRead, myArray, offsetRead.Length);
   DoSomething(myArray);
}