2013-04-09 13 views
5

Ricevo flussi di I/O di sistema da una sorgente. Procedere con l'oggetto flusso solo se contiene la stringa "MSTND".Ricerca pattern in un System.IO.Stream

Mi rendo conto che non c'è molto che posso fare sullo streaming a meno che non lo converti in stringa. La conversione stringa è solo per la corrispondenza sottostringa. Ma non voglio fare nulla che richieda molto tempo o spazio. Quanto tempo e molto spazio è una conversione da Stream a stringa solo per la corrispondenza sottostringa?

Il codice che ho scritto è:

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

risposta

0

A seconda di dove nel flusso vi aspettate questa sequenza sarebbe abbastanza efficiente per convertire in una stringa per eseguire la stringa. Se si trova in un punto standard ogni volta, è possibile leggere il numero di byte richiesti e convertirli in una stringa.

Date un'occhiata a questo per un po 'di riferimento: http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx

In alternativa si potrebbe convertire la stringa "MSTND" ad un byte [] e cercare il flusso per il byte [].

Edit:

ho trovato How do I get a consistent byte representation of strings in C# without manually specifying an encoding? che dovrebbe aiutare con la conversione della stringa in byte [].

3

Quello che si sta facendo andrebbe bene, ma una volta letto lo stream in una stringa, si potrebbe semplicemente restituire la stringa in modo da non dover leggere nuovamente lo stream.

Si noti inoltre che si sta utilizzando il metodo Read errato. Restituisce il numero di byte letti da intere array, poiché non deve restituire il numero di byte richiesto, anche se non si trova alla fine del flusso. Devi eseguire il ciclo finché non hai letto tutti i byte dallo stream.

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

Usage:

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