65.9K
CodeProject 正在变化。 阅读更多。
Home

BinaryReader.ReadLine 扩展

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (2投票s)

2015年6月1日

CPOL

1分钟阅读

viewsIcon

14859

这个辅助函数为 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 首次版本

© . All rights reserved.