在c#

时间:2018-03-28 19:53:07

标签: c# performance stream compare readline

我需要从流中读取字节(从字符串转换为字节数组然后发送到流)并在遇到特定序列时立即停止读取,在我的情况下它是[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”结尾的字符串。

我的问题是 - 在性能方面哪种方法更可取(如果有的话,可能两者都太慢而且有更好的方式我真的想知道)?

1 个答案:

答案 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
        }
    }
}