2013-04-09 2 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 
}