2013-04-09 24 views
5

Tôi đang nhận Luồng IO hệ thống từ một nguồn. Tôi sẽ chỉ tiếp tục với đối tượng luồng nếu nó chứa chuỗi "MSTND".Tìm kiếm mẫu trong System.IO.Stream

Tôi nhận ra rằng tôi không thể làm gì nhiều trên luồng trừ khi tôi chuyển đổi chuỗi thành chuỗi. Việc chuyển đổi chuỗi chỉ dành cho kết hợp chuỗi con. Nhưng tôi không muốn làm bất cứ thứ gì chiếm nhiều thời gian hoặc không gian. Làm thế nào thời gian/không gian chuyên sâu là một chuyển đổi từ Stream thành chuỗi chỉ cho phù hợp với chuỗi phụ?

Mã tôi đã viết là:

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

Trả lời

0

Tùy thuộc vào nơi trong luồng mà bạn đang mong chuỗi này nó sẽ là khá hiệu quả để chuyển đổi thành một chuỗi để thực hiện các chuỗi con. Nếu nó ở một điểm tiêu chuẩn mỗi lần thì bạn có thể đọc qua số byte cần thiết và chuyển đổi chúng thành một chuỗi.

Hãy xem này đối với một số tài liệu tham khảo: http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx

Hoặc bạn có thể chuyển đổi chuỗi "MSTND" tới byte [] và tìm kiếm dòng cho byte [].

Edit:

tôi thấy How do I get a consistent byte representation of strings in C# without manually specifying an encoding? mà nên giúp chuyển kí byte [].

3

Những gì bạn đang làm sẽ hoạt động tốt, nhưng khi bạn đã đọc luồng vào chuỗi, bạn chỉ có thể trả lại chuỗi để không phải đọc lại luồng.

Lưu ý rằng bạn đang sử dụng phương pháp Read sai. Nó trả về số byte đã đọc trong mảng, bởi vì nó không phải trả về nhiều byte như bạn yêu cầu, ngay cả khi nó không ở cuối luồng. Bạn phải lặp lại cho đến khi bạn đã đọc tất cả các byte từ luồng.

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

Cách sử dụng:

string s = StreamHasString(vStream); 
if (s != null) { 
    // proceed 
} 
Các vấn đề liên quan