2013-04-09 14 views
5

Otrzymuję strumienie systemowe IO ze źródła. Będę kontynuował obiekt strumienia tylko wtedy, gdy zawiera ciąg "MSTND".Wyszukiwanie wzoru w System.IO.Stream

Zdaję sobie sprawę, że niewiele mogę zrobić w strumieniu, chyba że skonwertuję go na ciąg. Konwersja łańcuchów służy tylko do dopasowywania podciągów. Ale nie chcę robić niczego, co zajmuje dużo czasu lub przestrzeni. Jak intensywny czas/przestrzeń jest konwersją ze strumienia do ciągu tylko w celu dopasowania podciągów?

Kod Pisałem to:

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

Odpowiedz

0

W zależności od tego, gdzie w strumieniu czekasz ta sekwencja byłoby dość skuteczny do konwersji na ciąg wykonać podciąg. Jeśli za każdym razem znajduje się w standardowym miejscu, możesz odczytać liczbę wymaganych bajtów i przekształcić je w ciąg znaków.

Spójrz na to z jakiegoś odniesienia: http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx

Ewentualnie można przekonwertować ciąg „MSTND” do byte [] i szukać strumień dla byte [].

Edit:

znalazłem How do I get a consistent byte representation of strings in C# without manually specifying an encoding? które powinny pomóc w konwersji ciąg byte [].

3

To, co robisz, działa dobrze, ale po przeczytaniu strumienia w łańcuchu możesz po prostu zwrócić ciąg znaków, aby nie trzeba było ponownie go odczytywać.

Należy również zauważyć, że używasz niewłaściwej metody Read. Zwraca liczbę bajtów odczytanych w tablicy int, ponieważ nie musi zwracać tylu bajtów, ile zażądałeś, nawet jeśli nie znajduje się na końcu strumienia. Musisz pętli, dopóki nie przeczytasz wszystkich bajtów ze strumienia.

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

Zastosowanie:

string s = StreamHasString(vStream); 
if (s != null) { 
    // proceed 
}