2011-06-27 83 views
6

我有这个文本文件包含不同的字段。有些字段可能包含二进制数据。我需要获取文件中的所有数据,但现在使用StreamReader时,它不会读取二进制数据块和数据。什么是解决这个问题的最佳解决方案?StreamReader和二进制数据

例子:

field1|field2|some binary data here|field3 

现在我读这样的文件:

public static string _fileToBuffer(string Filename) 
{ 
    if (!File.Exists(Filename)) throw new ArgumentNullException(Filename, "Template file does not exist"); 

    StreamReader reader = new StreamReader(Filename, Encoding.Default, true); 
    string fileBuffer = reader.ReadToEnd(); 
    reader.Close(); 

    return fileBuffer; 
} 

编辑:我知道二进制领域的开始和结束位置。

回答

7

StreamReader不是专为二进制数据。它专为文本数据设计,这就是为什么它扩展了TextReader。要读取二进制数据,您应该使用Stream,而不要尝试将结果放入一个字符串中(对于文本数据来说也是如此)。

通常,将二进制数据和文本数据混合在一个文件中是一个坏主意 - 如果二进制数据包含|例如符号?您可能希望以某种文本编码形式包含二进制数据,例如避免使用|的base64变体。

+0

我无法控制数据源,因此我只好以某种方式处理它。 – hs2d

+0

@ hs2d:那么如果二进制数据包含ASCII(或使用任何编码)代表'|',会发生什么?前两个字段中是否有任何内容告诉您预期的长度? –

+0

没有什么告诉我预期的长度。看看我的另一个问题。我使用模板来获取字段分隔符什么标记一个字段的结尾:[链接](http://stackoverflow.com/questions/6479505/c-template-parsing-and-matching-with-text-file) – hs2d

9

使用BinaryReader

+0

和BinaryWriter以合理的二进制格式写入文件。 – Guillaume

+0

当我使用BinaryReader然后il得到二进制的所有字段,所以我应该从那里去取回字符不是二进制数据的字段? – hs2d

+0

@ hs2d StringBuilder + BinaryReader.ReadChar但如果您可以更改源文件,请使用ReadString。 – Guillaume