2010-06-18 37 views
13

Tôi có đoạn code sau đây để đọc dữ liệu từ một Stream (trong trường hợp này, từ một đường ống đặt tên) và thành một mảng byte:Cách tốt nhất để chuyển đổi luồng (không biết chiều dài) thành mảng byte, trong .NET?

// NPSS is an instance of NamedPipeServerStream 

int BytesRead; 
byte[] StreamBuffer = new byte[BUFFER_SIZE]; // size defined elsewhere (less than total possible message size, though) 
MemoryStream MessageStream = new MemoryStream(); 

do 
{ 
    BytesRead = NPSS.Read(StreamBuffer, 0, StreamBuffer.Length); 
    MessageStream.Write(StreamBuffer, 0, BytesRead); 
} while (!NPSS.IsMessageComplete); 

byte[] Message = MessageStream.ToArray(); // final data 

Ông có thể xin hãy xem và cho tôi biết nếu nó có thể được thực hiện hiệu quả hơn hoặc gọn gàng? Dường như hơi lộn xộn một chút, bằng cách sử dụng MemoryStream. Cảm ơn!

Trả lời

18

Không được sao chép một cách không biết xấu từ Jon Skeet's article.

public static byte[] ReadFully (Stream stream) 
{ 
    byte[] buffer = new byte[32768]; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     while (true) 
     { 
      int read = stream.Read (buffer, 0, buffer.Length); 
      if (read <= 0) 
       return ms.ToArray(); 
      ms.Write (buffer, 0, read); 
     } 
    } 
} 
+1

Điều này đọc đến cuối luồng, nhưng mục đích là chỉ đọc cho đến khi 'IsMessageComplete'. –

+1

Cảm ơn bạn đã liên kết đến bài viết; có vẻ như tôi đang làm khá nhiều thuật toán tương tự nhưng với một điều kiện kết thúc khác trên vòng lặp. –

+1

Cảm ơn. Nó giúp tôi giải quyết vấn đề của mình. – nvtthang

0

Dường như giải pháp hiện tại của bạn khá tốt. Bạn có thể xem xét gói nó thành một phương pháp mở rộng nếu bạn muốn mã trông sạch hơn.

+0

Thú vị, tôi chưa bao giờ nghe nói về các phương pháp mở rộng trước khi đăng bài của bạn. Cảm ơn bạn đã tip và xem mã của tôi –

3
int read = stream.Read (buffer, 0, buffer.Length); 

Đường này sẽ chặn vĩnh viễn nếu không có sẵn dữ liệu. Đọc là một chức năng chặn và nó sẽ chặn các sợi cho đến khi nó đọc ít nhất một byte nhưng nếu không có dữ liệu thì nó sẽ chặn mãi mãi.

+0

@ derek-beattie làm thế nào tôi có thể tạo ra các vấn đề này? –

+0

@IvandroIsmael abhinaw đã trả lời câu hỏi này –

+0

Ohw, tôi xin lỗi bạn đời Derek-Beattie./cc @abhinaw –

Các vấn đề liên quan