【问题标题】:StreamReader and binary dataStreamReader 和二进制数据
【发布时间】:2011-06-27 10:06:40
【问题描述】:

我有这个包含不同字段的文本文件。某些字段可能包含二进制数据。我需要获取文件中的所有数据,但现在使用 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;
}

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

【问题讨论】:

    标签: c# .net binary-data streamreader


    【解决方案1】:

    使用BinaryReader

    【讨论】:

    • 和 BinaryWriter 以合理的二进制格式写入文件。
    • 当我使用 BinaryReader 时,我会以二进制形式获取所有字段,那么我应该从那里去哪里将非二进制数据的字段作为字符串取回?
    • @hs2d StringBuilder + BinaryReader.ReadChar 但如果您可以更改源文件,请使用 ReadString。
    • @Guillaume,无法更改源文件。
    【解决方案2】:

    StreamReader 不是为二进制数据设计的。它是为 text 数据设计的,这就是它扩展 TextReader 的原因。要读取二进制数据,您应该使用Stream,而不是尝试将结果放入字符串(同样,对于文本数据)。

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

    【讨论】:

    • @hs2d:那么如果二进制数据包含| 的ASCII(或使用的任何编码)表示,会发生什么?前两个字段中是否有任何内容可以告诉您预期的长度?
    • 没有什么能告诉我预期的长度。看看我的另一个问题。我使用模板来获取字段分隔符标记一个字段的结尾:link
    • 好的,了解更多信息。二进制字段始终具有相同的长度,我知道开始和结束位置。我更新了我原来的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多