2013-04-09 16 views
5

Bir kaynaktan Sistem IO Akışları alıyorum. Akış nesnesine yalnızca "MSTND" dizesini içeriyorsa devam edeceğim.Desen arama bir System.IO.Stream

Akışı dize haline getirmedikçe akışta yapabileceğim fazla bir şey olmadığını anlıyorum. Dize dönüştürme sadece alt dizgi eşleşmesi içindir. Ama çok fazla zaman alan ya da yer kaplayan hiçbir şey yapmak istemiyorum. Zaman/alan yoğunluğu, yalnızca alt dizgi eşleşmesi için Akıştan dizeye nasıl bir dönüşümdür?

yazdım kodudur:

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

cevap

0

akışında bu dizi o alt dizeyi gerçekleştirmek için bir dizeye dönüştürmek için oldukça verimli olacaktır bekliyorsanız yere bağlı. Eğer her defasında standart bir noktada ise, gerekli olan bayt sayısını okuyabilir ve bir dizgeye dönüştürebilirsiniz.

bazı referans için bu bir göz atın: http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx

Alternatif bir byte [] dize "MSTND" dönüştürmek ve byte [] olarak canlı arayabilirsiniz.

Düzenleme:

ben [] byte dize dönüştürme yardımcı gereken How do I get a consistent byte representation of strings in C# without manually specifying an encoding? bulundu. Eğer iyi çalışacak yapıyoruz, ancak bir dizeye akışı okudum kez tekrar akışı okumak zorunda kalmamak için, sadece dize geri dönebilirler Ne

3

. Yanlış Read yöntemini kullanırken de

Not. Dizinin içine girilen bayt sayısını döndürür, çünkü akış sonunda olmasa bile istediğiniz sayıda bayt döndürmek zorunda kalmaz. Akıştan tüm baytları okuyana kadar döngü yapmanız gerekir.

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

Kullanımı:

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