如何让 StreamReader.ReadLine() 区分 “ ” 和 “”

本文关键字:区分 StreamReader ReadLine | 更新日期: 2023-09-27 18:33:53

我创建了一个函数,该函数使用 StreamReaderTcpClient 接收分块的 HTTP 包。这是我创建的内容:

    private string recv()
    {
        Thread.Sleep(Config.ApplicationClient.WAIT_INTERVAL);
        string result = String.Empty;
        string line = reader.ReadLine();
        result += line + "'n";
        while (line.Length > 0)
        {
            line = reader.ReadLine();
            result += line + "'n";
        }
        for (int size = -1, total = 0; size != 0; total = 0)
        {
            line = reader.ReadLine();
            size = PacketAnalyzer.parseHex(line);
            while (total < size)
            {
                line = reader.ReadLine();
                result += line + "'n";
                int i = encoding.GetBytes(line).Length;
                total += i + 2; //this part assumes that line break is caused by "'r'n", which is not always the case
            }
        }
        reader.DiscardBufferedData();
        return result;
    }

对于它读取的每个新行,它都会增加 2 到 total 的额外长度,假设新行是由 "''r'" 创建的。这几乎适用于所有情况,除了数据包含"'",我不知道如何将其与"''r'"区分开来。对于这种情况,它会认为它读取的比实际阅读的要多,从而缩短了读取一个块并使PacketAnalyzer.parseHex()面临错误。

如何让 StreamReader.ReadLine() 区分 “
” 和 “”

(在问题编辑中回答。 转换为社区维基答案。请参阅将问题的答案添加到问题本身时,适当的操作是什么?)

OP写道:

已解决:我做了以下两个行读取和流清空功能,我又回到了正轨。

NetworkStream ns;
//.....
private void emptyStreamBuffer()
{
    while (ns.DataAvailable)
        ns.ReadByte();
}
private string readLine()
{
    int i = 0; 
    for (byte b = (byte) ns.ReadByte(); b != ''n'; b = (byte) ns.ReadByte())
        buffer[i++] = b;
    return encoding.GetString(buffer, 0, i);
}