C# System.IO.Stream中的模式搜索

C# System.IO.Stream中的模式搜索,c#,stream,C#,Stream,我正在从源接收系统IO流。只有当stream对象包含字符串“MSTND”时,我才会继续处理它 我意识到,除非我把它转换成字符串,否则我在流上做不了什么。字符串转换仅用于子字符串匹配。但我不想做任何占用大量时间或空间的事情。仅为了子字符串匹配,从流到字符串的转换的时间/空间密集程度如何 我写的代码是: private bool StreamHasString (Stream vStream) { bool containsStr = false; byte[] streamBy

我正在从源接收系统IO流。只有当stream对象包含字符串
“MSTND”
时,我才会继续处理它

我意识到,除非我把它转换成字符串,否则我在流上做不了什么。字符串转换仅用于子字符串匹配。但我不想做任何占用大量时间或空间的事情。仅为了子字符串匹配,从流到字符串的转换的时间/空间密集程度如何

我写的代码是:

private bool StreamHasString (Stream vStream)
{
     bool containsStr = false;
     byte[] streamBytes = new byte[vStream.Length];
     vStream.Read( streamBytes, 0, (int) vStream.Length);
     string stringOfStream = Encoding.UTF32.GetString(streamBytes);
     if (stringOfStream.Contains("MSTND"))
     {
        containsStr = true;
     }     
     return containsStr ;
}

根据您期望该序列在流中的位置,转换为字符串以执行子字符串将是相当有效的。如果它每次都在一个标准位置,那么您可以读取所需的字节数并将其转换为字符串

请看以下内容以供参考:

或者,您可以将字符串“MSTND”转换为字节[],并在流中搜索字节[]

编辑:


我发现这有助于将字符串转换为字节[]。

您正在做的工作可以正常工作,但一旦您将流读入字符串,就可以返回字符串,这样您就不必再次读取流了

还要注意,您使用的
Read
方法是错误的。它返回读取到数组中的字节数,因为它不必返回您请求的字节数,即使它不在流的末尾。必须循环,直到从流中读取所有字节

private string StreamHasString (Stream vStream) {
  byte[] streamBytes = new byte[vStream.Length];

  int pos = 0;
  int len = (int)vStream.Length;
  while (pos < len) {
    int n = vStream.Read(streamBytes, pos, len - pos);
    pos += n;
  }

  string stringOfStream = Encoding.UTF32.GetString(streamBytes);
  if (stringOfStream.Contains("MSTND")) {
    return stringOfStream;
  } else {
    return null;
  }
}
string s = StreamHasString(vStream);
if (s != null) {
  // proceed
}