【问题标题】:How do I read a binary file in C#?如何在 C# 中读取二进制文件?
【发布时间】:2011-01-05 12:19:07
【问题描述】:

我有一个存在于文本和二进制图像中的文件,我需要从 0 到 30 位置读取相关文本,而 31 上的位置将是二进制格式的图像。 我必须遵循哪些步骤才能继续解决该问题?

目前,我正在尝试使用FileStream 读取它,然后我将 FileStream var 移动到一个BinaryReader,如下所示:

FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)
BinaryReader br = new BinaryReader(fs)

从那里开始,我迷路了。


更新

好的,我现在可以读取我的文件了。 直到位置 30 是我的 30 字符串,从位置 30 开始是位串,它实际上是一个图像。 我想知道如何从位置 30 读取字节然后保存图像! 有没有人有任何想法? 按照我的文件中的一个例子,你会有一些想法:

£ˆ‰¢@‰¢@¢–”…@•…¦@„£@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.-///%<<??@[K}@k{M÷]kðñôôô}ù~øòLKóôòÿg

请注意,即使@@@ 是我的字符串,图片也会是一个字节。

【问题讨论】:

  • 那么你是如何阅读文件的呢?
  • 我正在阅读如下内容:我正在使用 FileStream,然后我将 FileStream var 移动到一个 BinaryReader,如下所示: 例如:FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess. Read)) BinaryReader br = new BinaryReader(fs) 从现在开始我迷路了。
  • 为了将来参考,最好编辑您的原始问题以添加进一步说明。您会受益于更好的格式设置,尤其是如果您尝试显示代码。

标签: c# .net binaryreader


【解决方案1】:

用一些代码扩展罗杰的答案。

字符串总是以某种格式编码,要读取它,您需要知道该编码(尤其是在使用二进制阅读器时)。在许多情况下,它是纯 ASCII,如果您得到意外结果(奇怪的字符等),您可以使用 Encoding.ASCII.GetString 对其进行解析,然后尝试另一种编码。

要解析图像,您需要使用图像解析器。 .NET 有几个作为其 GUI 命名空间的一部分。在下面的示例中,我使用了来自System.Drawing(windows 窗体)的示例,但 WPF 中存在类似的示例,并且那里有许多第三方库。

using (var reader = new BinaryReader(File.Open(someFile, FileMode.Open))
{
    // assuming your string is in plain ASCII encoding:
    var myString = System.Text.Encoding.ASCII.GetString(reader.ReadBytes(30));
    // The rest of the bytes is image data, use an image library to process it
    var myImage = System.Drawing.Image.FromStream(reader.BaseStream);
}

现在 MSDN 有一个 caution about 将 BaseStream 与 BinaryReader 结合使用,但我相信在上述情况下你应该是安全的,因为你没有在图像之后使用流。但要留意问题。 如果失败,您可以随时将字节读入新的byte[] 并从这些字节创建新的 MemoryStream。

编辑:

您在评论中指出您的字符串是EBCDIC,这意味着您无法使用任何内置编码对其进行解码。快速的 google 搜索显示了一个 EBCDIC .NET 编码类上的 post by Jon Skeet,这可能会让您入门。它基本上会给你ebcdicEncoding.GetString(...);

【讨论】:

  • 所以,当我使用 myString 作为下面的格式时: System.Text.Encoding.ASCII.GetString(reader.ReadBytes(30));该程序将其返回给我:????@??@????@???@????@@@@@@@@@ 但我的文件有以下文字:£^‰¢@ ‰¢@¢–”…@•…¦@„£@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  • 我认为我必须得到其他编码的字符串!
  • 我们应该如何知道使用了哪种编码?有 UTF8 和许多依赖于语言环境的编码。
  • 不,我使用 EBCDIC 编码!
  • 哦,EBCDIC.. 不错 :) .. 这意味着您必须自己进行转换,因为 .NET 中没有内置的编码器/解码器
【解决方案2】:

您可以使用FileStream 打开和读取文件。如果将前 30 个字节读入缓冲区,则可以使用“string Encoding.ASCII.GetString(byte[] buffer, int offset, int length)”将其转换为字符串。

【讨论】:

  • 抱歉,我想用 substring 命令读取前 30 个字节?
  • 为什么?通过 GetString() 的方法效果很好。如果您从 BinaryReader 读取到缓冲区(字节数组),则可以使用该缓冲区来提取字符串以及图像数据。
  • @tomcamara:子字符串不会从文件中读取,它会提取一段字符串。只要按照罗杰说的去做,它就会起作用:-)
  • @tomcamara:GetString() 的最后一个参数指定要读取的字节数。如果要读取前 30 个字节,则偏移量应为 0,长度应为 30。
猜你喜欢
  • 2011-01-26
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2011-09-03
  • 2016-01-15
  • 1970-01-01
  • 2012-04-29
相关资源
最近更新 更多