读取混合(即文本和二进制)数据的最佳方法是什么?

时间:2009-02-02 19:18:37

标签: c# file-io

我需要能够读取混合二进制和非二进制数据的文件格式。假设我知道输入是好的,那么最好的方法是什么?举个例子,让我们把一个文件作为第一行,换行符(0x0D 0x0A),然后是十个字节的二进制数据。当然,我可以计算换行符的位置,然后创建一个二进制读取器并寻找那个位置,但我一直认为必须有更好的方法。

3 个答案:

答案 0 :(得分:3)

您可以使用System.IO.BinaryReader。但问题是,在调用任何Read方法之前,必须知道要读取的数据类型。

Read(byte[], int, int)
Read(char[], int, int)
Read()
Read7BitEncodedInt()
ReadBoolean()
ReadByte()
ReadBytes(int)
ReadChar()
ReadChars()
ReadDecimal()
ReadDouble()
ReadInt16()
ReadInt32()
ReadInt64()
ReadSByte()
ReadSingle()
ReadString()
ReadUInt16()
ReadUInt32()
ReadUInt64()

当然,在System.IO.BinaryWriter中编写相同的方法。

答案 1 :(得分:2)

此文件格式是否已修复?如果不是,那么更改为使用长度前缀格式的字符串是一个非常好的主意。然后你可以读取恰当的金额并将其转换为字符串。

否则,您需要从文件中读取块,扫描换行符,并解码正确数量的数据或(如果找不到换行符)将缓冲区放在其他位置(例如MemoryStream)或只需记住起点并适当地回放流。它丑陋,但这仅仅是因为文件格式不足。

我建议你不要“过度解码”(即在字符串后解码任意二进制数据) - 虽然它可能没有任何伤害,但在某些编码中你可能正在阅读一个不可能的二进制数据序列,然后开始进入DecoderFallbacks之类的领域。

答案 2 :(得分:1)

在阅读Compact Framework上通过网络传输的HTTP请求时,我不得不处理这个问题。我的解决方案是滚动我自己的非缓冲ASCII-only StreamReader,这样就可以安全地将调用交错到StreamReader和底层Stream。