c# - 如何在 C# 中读取二进制文件?

标签 c# .net binaryreader

我有一个存在于文本和二进制图像中的文件,我需要从 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

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

最佳答案

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

字符串总是以某种格式进行编码,要读取它,您需要知道该编码(特别是在使用二进制读取器时)。在许多情况下,它是纯 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不幸的是,这意味着您无法使用任何内置编码来对其进行解码。快速谷歌搜索显示 post by Jon Skeet EBCDIC .NET Encoding 类可能会帮助您入门。它本质上会给你 ebcdicEncoding.GetString(...);

关于c# - 如何在 C# 中读取二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4603909/

相关文章:

c# - .Net/C# : what's the real size of an integer?

c# - 如何从 AES 256 加密文件中获取文件类型

c# - 如何从基类中获取自定义属性?

c# - 通过 BinaryReader 将字节数组解压缩为字符串会产生空字符串

c++ - 我想在 C++ 中使用 ifstream 和 ofstream 来模仿 C# 的 BinaryReader/BinaryWriter 功能

c# - 将类成员的范围限制在私有(private)之外

c# - 清理导入的数据以确保它可以转换为有效的 JSON

.net - 我可以使用带有 mvc 4 的代码优先 Entity Framework 将日期时间用作键吗?

javascript - 从服务器端 (.NET) 向浏览器发送命令

c# - C# 中的 BinaryReader 读取字符串所有字符之间的 '\0'