2013-04-09 3 views
5

Я получаю потоки системы IO из источника. Я продолжу объект потока только в том случае, если он содержит строку "MSTND".Поиск по шаблону в System.IO.Stream

Я понимаю, что в потоке мало что можно сделать, если я не превращу его в строку. Преобразование строк предназначено только для подстроки. Но я не хочу делать ничего, что занимает много времени или пространства. Как интенсивность времени/пространства является преобразованием из 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

В зависимости от того, где в потоке вы ждете этой последовательности было бы достаточно эффективным, чтобы преобразовать в строку выполнить подстроку. Если его в стандартном месте каждый раз, то вы можете прочитать количество необходимых байтов и преобразовать их в строку.

Посмотрите на это по какой-то ссылке: http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx

В качестве альтернативы вы можете преобразовать строку «MSTND» на байт [] и поиска потока для байта [].

Edit:

Я нашел How do I get a consistent byte representation of strings in C# without manually specifying an encoding?, который должен помочь при преобразовании строки в Byte [].

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 
} 
Смежные вопросы