【问题标题】:Speed up reading a file to multiple bytes array and copy the offsets by if statement加快将文件读取到多字节数组并通过 if 语句复制偏移量
【发布时间】:2014-05-26 22:26:07
【问题描述】:

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

如何使用加速将文件读取到字节数组来优化/更快地优化我的代码,在这个 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();

【问题讨论】:

  • 为什么你认为这段代码需要变得不安全?你剖析过吗?此外,您还需要首先修复许多其他错误,例如,如果您读取的文件不是 1048576 字节的倍数,那么您输出的最后一个二进制字符串将用 0 填充以使其大小为 1048576 字节,因为您正在转换整个数组,而不仅仅是从硬盘读取的数量。
  • 您好,实际上我需要将此字节数组转换为字符串。我需要再次将字符串转换为另一个数组..问题是我当我转换为字符串并将其显示在文本框中..这需要很长时间..我需要的是使字符串转换更加优化
  • 请详细说明by editing your question你真正想要完成的事情。你陷入了XY Problem,不要问如何解决你遇到的问题,而要问你遇到的问题本身。
  • 感谢斯科特帮助我。那么有什么比每次读取 1048576 字节 1MB 更好的方法呢??
  • 萨米,不要私信联系个人; edit your question,就像 Scott 要求的那样。

标签: c# bytearray


【解决方案1】:

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

你的代码有问题:

  • 你没有读取整个文件(你在最后一个 1048576 字节的缓冲区被填满,接下来的 x 个字节不会被读取)
  • 您读取了一个字节数组然后将其转换为字符串?您应该使用 .NET 框架 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 包含所有需要的数据类型的读取方法,它应该允许您有效地读取任何类型的二进制文件。

至于您的其他问题,请查看来自 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);
}

【讨论】:

  • 谢谢这段代码可以读取从0到文件长度的字节偏移量??然后我想在while循环中做if语句..如果偏移量是“00110011”,例如......做点什么..有什么想法吗??
  • 我编辑了我的答案。请考虑针对不同的问题提出不同的问题。不要忘记接受对您有帮助的答案。
  • 再次......谢谢你帮助我......但我可以要求在这段代码中编辑一些东西吗??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2012-01-06
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多