2013-04-09 12 views
5

ソースからシステムIOストリームを受信して​​います。文字列"MSTND"が含まれている場合に限り、ストリームオブジェクトを処理します。System.IO.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」を変換すると、バイト用のストリームを検索できます。

編集:

私は[]のバイトに文字列を変換するに役立つはずであるHow do I get a consistent byte representation of strings in C# without manually specifying an encoding?を見つけました。

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 
} 
関連する問題