我有一个存在于文本和二进制图像中的文件,我需要从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
请注意,即使是@ @ @也是我的字符串,因此图片将是一个字节。
答案 0 :(得分:3)
通过一些代码扩展Roger的答案。
字符串总是以某种格式编码,要读取它,您需要知道编码(特别是在使用二进制读取器时)。在许多情况下,它是纯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,遗憾的是,您无法使用任何内置编码对其进行解码。快速谷歌搜索在EBCDIC .NET编码类上显示post by Jon Skeet可能会让您入门。它基本上会给你ebcdicEncoding.GetString(...);
答案 1 :(得分:2)
您可以使用FileStream打开并阅读该文件。如果您将前30个字节读入缓冲区,则可以使用“string Encoding.ASCII.GetString(byte [] buffer,int offset,int length)”将其转换为字符串。