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