Лучший способ преобразовать поток (неизвестной длины) в байтовый массив, в .NET? - PullRequest
15 голосов
/ 18 июня 2010

У меня есть следующий код для чтения данных из потока (в данном случае из именованного канала) и в байтовый массив:

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

Не могли бы вы взглянуть и сообщить мне, еслиэто можно сделать более эффективно или аккуратно?Кажется, немного грязно, используя MemoryStream.Спасибо!

Ответы [ 3 ]

21 голосов
/ 18 июня 2010

Бесстыдно скопировано из статьи Джона Скита .

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);
       }
   }
}
3 голосов
/ 20 июня 2012
int read = stream.Read (buffer, 0, buffer.Length);

Эта строка будет заблокирована навсегда, если нет доступных данных.Чтение является функцией блокировки, и она будет блокировать поток до тех пор, пока он не прочитает хотя бы один байт, но если данных нет, он будет блокироваться навсегда.

1 голос
/ 18 июня 2010

Похоже, ваше текущее решение довольно хорошее.Возможно, вы захотите включить его в метод расширения, если хотите, чтобы код выглядел чище.

...