Подтвердить что ты не робот

Лучший способ конвертировать поток (неизвестной длины) в байтовый массив в .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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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