2010-06-18 6 views
13

Ich habe den folgenden Code Daten aus einem Stream (in diesem Fall von einem Named Pipe) und in einen Byte-Array zu lesen:Die beste Methode zum Konvertieren von Stream (unbekannter Länge) in Byte-Array in .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 

Könnten Sie einen Blick darauf werfen bitte und lassen Sie mich wissen, ob es sein kann, effizienter oder sauber gemacht? Scheint ein bisschen chaotisch wie es ist, mit einem MemoryStream. Vielen Dank!

Antwort

18

Schamlos kopiert von 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

Dies wird an das Ende des Streams gelesen, aber die Absicht ist nur bis "IsMessageComplete" zu lesen. –

+1

Danke für den Link zum Artikel; es sieht so aus, als ob ich ziemlich genau den gleichen Algorithmus mache, aber mit einer anderen Endbedingung in der Schleife. –

+1

Danke. Es hilft mir, mein Problem zu lösen. – nvtthang

0

Es sieht aus wie Ihre aktuelle Lösung ist ziemlich gut. Sie können es in eine Erweiterungsmethode einschließen, wenn Sie möchten, dass der Code sauberer aussieht.

+0

Interessant, ich hatte noch nie von Erweiterungsmethoden vor Ihrem Post gehört. Danke für den Tipp und für das Ansehen meines Codes –

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

Diese Zeile wird für immer blockiert, wenn keine Daten verfügbar sind. Lesen ist eine blockierende Funktion und es wird den Thread blockieren, bis es mindestens ein Byte liest, aber wenn es keine Daten gibt, wird es für immer blockieren.

+0

@ derek-beattie Wie kann ich diese Probleme produzieren? –

+0

@IvandroIsmael abhinaw hat diese Frage beantwortet –

+0

Ohh, tut mir leid, Kumpel Derek-Beattie./cc @abhinaw –