2

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

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

4

2 回答 2

3

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

字符串总是以某种格式编码,要读取它,您需要知道该编码(尤其是在使用二进制阅读器时)。在许多情况下,它是纯 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对将 BaseStream 与 BinaryReader 结合使用时提出了警告,但我相信在上述情况下你应该是安全的,因为你没有在图像之后使用流。但要留意问题。如果失败,您始终可以将字节读入一个新的字节byte[]并从这些字节创建一个新的 MemoryStream。

编辑:

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

于 2011-01-05T13:04:15.740 回答
2

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

于 2011-01-05T12:29:57.480 回答