我需要从流中读取字节(从字符串转换为字节数组然后发送到流)并在遇到特定序列时立即停止读取,在我的情况下它是[13,10,13,10]或“\ r \ n \ r \ n“如果转换为字符串(ASCII)。
目前我有两个版本的相同流程:
1)从流中读取一个字节并检查每个字节,如果读取序列的最后4个字节等于[13,10,13,10] (请注意,我无法读取并检查每4个字节,因为序列可以是例如,7个字节长,因此它将读取前4个字节然后卡住,因为只有4个字节中的3个可用):
NetworkStream streamBrowser = tcpclientBrowser.GetStream();
byte[] data;
using (MemoryStream ms = new MemoryStream())
{
byte[] check = new byte[4] { 13, 10, 13, 10 };
byte[] buff = new byte[1];
do
{
streamBrowser.Read(buff, 0, 1);
ms.Write(buff, 0, 1);
data = ms.ToArray();
} while (!data.Skip(data.Length - 4).SequenceEqual(check));
}
2)使用 StreamReader.ReadLine 读取直到“\ r \ n”,然后再次读取以查看返回的行是否为 null ,然后添加到第一个返回字符串“\ r \ n”,这样我就会得到以“\ r \ n \ r \ n”结尾的字符串。
我的问题是 - 在性能方面哪种方法更可取(如果有的话,可能两者都太慢而且有更好的方式我真的想知道)?
答案 0 :(得分:0)
我喝醉了,但也许会有所帮助:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace ConsoleApp5
{
class Program
{
static void Main (string[] args)
{
var ms = new MemoryStream (new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
var sequence = new byte[] { 6, 7, 8 };
var buffer = new byte[1];
var queue = new Queue<byte> ();
int position = 0;
while (true)
{
int count = ms.Read (buffer, 0, 1);
if (count == 0) return;
queue.Enqueue (buffer[0]);
position++;
if (IsSequenceFound (queue, sequence))
{
Console.WriteLine ("Found sequence at position: " + (position - queue.Count));
return;
}
if (queue.Count == sequence.Length) queue.Dequeue ();
}
}
static bool IsSequenceFound (Queue<byte> queue, byte[] sequence)
{
return queue.SequenceEqual (sequence);
// normal for (int i ...) can be faster
}
}
}