【问题标题】:Reading a DAT file with BinaryReader in C#在 C# 中使用 BinaryReader 读取 DAT 文件
【发布时间】:2020-12-31 23:51:21
【问题描述】:

我正在尝试使用 BinaryReady 读取 DAT 文件,但出现异常并且不明白为什么。 “无法阅读超出流的末尾”是我得到的消息。我的代码如下所示:

private void button1_Click(object sender, EventArgs e)

    {
        OpenFileDialog OpenFileDialog = new OpenFileDialog();
        OpenFileDialog.Title = "Open File...";
        OpenFileDialog.Filter = "Binary File (*.dat)|*.dat";
        OpenFileDialog.InitialDirectory = @"C:\";
        if (OpenFileDialog.ShowDialog() == DialogResult.OK)
        {
            FileStream fs = new FileStream(OpenFileDialog.FileName, FileMode.Open);
            BinaryReader br = new BinaryReader(fs);

            label1.Text = br.ReadString();
            label2.Text = br.ReadInt32().ToString();

            fs.Close();
            br.Close();
        }

我有一个包含大量信息的 DAT 文件,并希望能够将其读出,甚至可以将其放在表格中并绘制数据。但是我使用 C# 已经有一段时间了。因此,如果有人可以帮助我,我将不胜感激

【问题讨论】:

  • 哪一行抛出异常? (PS 从逻辑上讲,您应该在关闭流之前关闭阅读器。)
  • P.P.S.由于我们不知道文件格式或它是如何创建的,因此任何人都很难具体说明您应该做什么,或者您是否可以让它工作。如果您提供更多详细信息,也许我们可以提供更好的帮助。
  • 错误出现在'label1.text = br.ReadString();'
  • 你正在读取的文件是二进制文件还是文本文件?我不确定ReadString() 是如何实现的,但是如果我看到一个二进制阅读器读取一个字符串,我会假设它会继续读取,直到找到一个 00 字节。您能否提供您尝试读取的文件的内容,或者至少提供超过 Int32 的内容?

标签: c# binaryfiles


【解决方案1】:

BinaryReader 很少是读取外部文件的好选择;只有在与使用BinaryWriter写入文件的代码并行使用时才真正有意义,因为它们使用相同的约定。

想象这里发生的事情是您对ReadString 的调用试图对您的文件使用无效的约定 - 具体来说,它会正在读取一些字节(我想说 4,大端?)作为字符串的长度前缀,然后尝试读取那么多字节作为字符串。但如果这不是文件内容:那很容易尝试读取乱码,将其解释为一个巨大的数字,然后无法读取那么多字节。

如果您正在处理任意文件(与BinaryWriter 无关),那么您确实需要对协议/格式有很多了解。鉴于文件扩展名不明确,我不会从“.dat”中推断出任何东西 - 重要的是:数据是什么以及它来自哪里?。只有有了这些信息,才能对阅读它做出明智的评论。


来自 cmets,这里有一些(未经测试的)代码应该帮助您开始将内容解析为跨度:

public static YourResultType Process(string path)
{
    byte[] oversized = null;
    try
    {
        int len, offset = 0, read;
        // read the file into a leased buffer, for simplicity
        using (var stream = File.OpenRead(path))
        {
            len = checked((int)stream.Length);
            oversized = ArrayPool<byte>.Shared.Rent(len);
            while (offset < len &&
                (read = stream.Read(oversized, offset, len - offset)) > 0)
            {
                offset += read;
            }
        }
        // now process the payload from the buffered data
        return Process(new ReadOnlySpan<byte>(oversized, 0, len));
    }
    finally
    {
        if (oversized is object)
            ArrayPool<byte>.Shared.Return(oversized);
    }
}
private static YourResultType Process(ReadOnlySpan<byte> payload)
    => throw new NotImplementedException(); // your code here

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多