我从源接收系统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 ;
}
答案 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 []。