BinaryReader.ReadLine 扩展






4.67/5 (2投票s)
这个辅助函数为 BinaryReader 添加了一个 ReadLine 方法。这允许程序从同一个流中读取二进制数据和文本数据。
引言
.NET 框架中有两个不同的类:BinaryReader 读取字节和二进制数据,而 TextReader 和 StreamReader 读取文本。
在某些情况下,你可能希望在两者之间切换,通常如果你想读取 FTP 或 HTTP 流,你需要能够从同一个流中读取 ASCII 和二进制数据。
很多人在论坛上要求过这个功能。我看到过一些尝试实现这个功能,但没有看到任何简单且涵盖所有编码的方案。 这就是我决定发布我的解决方案的原因。
这个小函数提供了一种简单(如果不是非常快速)的方法,可以从 BinaryReader 获取一个字符串(编码为 ASCII 或任何其他编码)。
使用代码
无需添加 DLL。只需将下面的类添加到你的解决方案中即可。
这段代码为 BinaryStream 添加了一个新的 ReadLine() 方法。
public static class BinaryReaderExtension
{
public static String ReadLine(this BinaryReader reader)
{
var result = new StringBuilder();
bool foundEndOfLine = false;
char ch;
while (!foundEndOfLine)
{
try
{
ch = reader.ReadChar();
}
catch (EndOfStreamException ex)
{
if (result.Length == 0) return null;
else break;
}
switch (ch)
{
case '\r':
if (reader.PeekChar() == '\n') reader.ReadChar();
foundEndOfLine = true;
break;
case '\n':
foundEndOfLine = true;
break;
default:
result.Append(ch);
break;
}
}
return result.ToString();
}
}
关注点
这段代码遵循与 StreamReader.ReadLine 相同的模式。
一行定义为字符序列,后跟回车符('\r')、换行符('\n')或紧跟换行符的回车符。结果字符串不包含终止的回车符和/或换行符。如果已到达输入流的末尾,则返回值为 null。
历史
2015-06-01 首次版本