【问题标题】:Fastest way to read 2mb binary file in decimal or hex?以十进制或十六进制读取 2mb 二进制文件的最快方法?
【发布时间】:2015-02-18 18:22:55
【问题描述】:

我正在尝试使用 datagridview 将二进制文件读入我自己的十六进制编辑器。

这是我最初的方法

FileStream RawD = new FileStream(ECUFileName, FileMode.Open, FileAccess.Read);
BinaryReader RawB = new BinaryReader(RawD);

然后我也尝试了二进制阅读器......

现在我正在使用

MemoryMappedFile RawD = MemoryMappedFile.CreateFromFile(ECUFileName);
MemoryMappedViewStream stream = RawD.CreateViewStream();
BinaryReader RawB = new BinaryReader(stream);

我想要代码做的就是读取小数并将其放入数据网格视图中。 一个 2mb 的文件需要很长时间。

while (RawB.BaseStream.Position <= RawB.BaseStream.Length)
{
    if (term == true) break;
    DataGridViewRow row = (DataGridViewRow)DataG.Rows[0].Clone();
    DataG.Rows.Add(row);
    for (int P = 0; P < I; P++)
    {
        if (RawB.BaseStream.Position == RawB.BaseStream.Length) break;
        Int16 Byte = RawB.ReadInt16();
        string ByteStr = string.Format("{0}",Byte);
        DataG[P, X].Value = ByteStr;
        DataG[P, X].ReadOnly = true;
        string ADR = string.Format("{0:x6}", X * 10); ;
        DataG.Rows[X].HeaderCell.Value = ADR;
        DataG.FirstDisplayedScrollingRowIndex = DataG.FirstDisplayedScrollingRowIndex + 1;
        if (term == true) break;
    }

我刚试过,好像快一点

byte[] bytes = File.ReadAllBytes(ECUFileName);
for (int i=0; i <= bytes.Length; i++)
{
    string result = Convert.ToString(bytes[i]);
    richTextBox1.AppendText(result);
}

be hex editor 不能用于我打算做的事情,所以我必须手动去做。

我读过很多文章,人们说用文件方法读取 AllBytes,将文件存储在内存中, 当我尝试使用文件方法时,它的工作速度也不快。

【问题讨论】:

  • 你的缓慢来自于使用网格,而不是读取文件。
  • 您的 MemoryMapped 方法是否更快? (似乎不太可能)。
  • 您是否尝试将数据加载到 DataTable 中并将其用作 DataGridView 的数据源?
  • 对于一个 2MB 的文件,我无法获得比约 10 秒更快的速度。您必须分页或使用 VirtualMode。

标签: c# datagridview hex hexdump


【解决方案1】:

我将工具箱中的一个 DataGridView 放到了一个 Form 上,并使用了以下代码:

static void Demo(DataGridView dgv)
{
    string src = @"C:\temp\currentData.txt";
    var data = File.ReadAllBytes(src);
    int nCols = 16; //number of columns to use in the DGV
    DataTable dt = new DataTable();

    for (int i = 0; i < nCols; i++)
    {
        dt.Columns.Add(new DataColumn { DataType = Type.GetType("System.Int16") });
    }

    var lastIndex = data.Length - nCols - 1;
    for (int i = 0; i < lastIndex; i += nCols * 2)
    {
        var dr = dt.NewRow();

        for (int j = 0; j <= nCols * 2 - 1; j += 2)
        {
            dr[j / 2] = BitConverter.ToInt16(data, i + j);
        }

        dt.Rows.Add(dr);
    }


    dgv.DataSource = dt;

}

private void Form1_Load(object sender, EventArgs e)
{
    Demo(dataGridView1);

}

不到一秒钟就显​​示了已安装的 DGV。 (使用旧的 i7 920。)代码中的任何愚蠢(例如一个错误)都是因为我从 VB.NET 手动翻译了它。事实上,如果它不是完整的行,它不会显示最后一行数据。我只是证明这种方式更快。此外,如果文件长度不是偶数字节,您应该进行适当的调整。

重要的部分是我填充了一个 DataTable 以供以后用作 DGV 的 DataSource。

使用 VirtualMode 可能会更好地显示较大的文件(正如 Hans Passant 所建议的那样)。

【讨论】:

    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多