7

我正在从源接收系统 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 ;
}
4

2 回答 2

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
}
于 2013-04-09T07:09:26.467 回答
1

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

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

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

编辑:

我发现如何在不手动指定编码的情况下获得 C# 中字符串的一致字节表示?这应该有助于将字符串转换为字节 []。

于 2013-04-09T06:52:43.167 回答