Frank Hamming
Frank Hamming

Reputation: 171

Best way to convert Stream (of unknown length) to byte array, in .NET?

I have the following code to read data from a Stream (in this case, from a named pipe) and into a byte array:

// 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

Could you please take a look and let me know if it can be done more efficiently or neatly? Seems a bit messy as it is, using a MemoryStream. Thanks!

Upvotes: 17

Views: 13495

Answers (3)

David Neale
David Neale

Reputation: 17048

Shamelessly copied from 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);
       }
   }
}

Upvotes: 23

Abhinaw Sharma
Abhinaw Sharma

Reputation: 676

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

This line will block forever if there is no data Available. Read is a blocking function and it will block the thread until it reads at least one byte but if there is no data then it will block forever.

Upvotes: 3

Stephen Cleary
Stephen Cleary

Reputation: 457402

It looks like your current solution is pretty good. You may consider wrapping it up into an extension method if you'd like the code to look cleaner.

Upvotes: 1

Related Questions