如何让 StreamReader.ReadLine() 区分 “ ” 和 “”
本文关键字:区分 StreamReader ReadLine | 更新日期: 2023-09-27 18:33:53
我创建了一个函数,该函数使用 StreamReader
和 TcpClient
接收分块的 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()
面临错误。
(在问题编辑中回答。 转换为社区维基答案。请参阅将问题的答案添加到问题本身时,适当的操作是什么?)
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); }