在System.IO.Stream中搜索模式

时间:2013-04-09 06:40:42

标签: c# stream

我从源接收系统IO流。我将继续使用流对象,只要它包含字符串"MSTND"

我意识到除非我将其转换为字符串,否则我在流上无能为力。字符串转换仅用于子字符串匹配。但我不想做任何占用大量时间或空间的事情。时间/空间密集是如何从Stream转换为字符串仅用于子字符串匹配?

我写的代码是:

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 ;
}

2 个答案:

答案 0 :(得分:3)

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

另请注意,您使用的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
}

答案 1 :(得分:0)

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

看看这个以供参考: http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx

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

编辑:

我发现How do I get a consistent byte representation of strings in C# without manually specifying an encoding?应该有助于将字符串转换为byte []。