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


person Frank Hamming    schedule 18.06.2010    source источник


Ответы (3)


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

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);
       }
   }
}
person David Neale    schedule 18.06.2010
comment
Это читает до конца потока, но намерение состоит в том, чтобы читать только до IsMessageComplete. - person Stephen Cleary; 18.06.2010
comment
Спасибо за ссылку на статью; похоже, что я использую тот же алгоритм, но с другим условием завершения цикла. - person Frank Hamming; 18.06.2010

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

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

person Abhinaw Sharma    schedule 20.06.2012
comment
@ derek-beattie, как я могу выпускать эти выпуски? - person Ivandro Jao; 22.02.2016
comment
@IvandroIsmael abhinaw ответил на этот вопрос - person Derek Beattie; 22.02.2016
comment
Ох, извини, приятель Дерек-Битти. / cc @abhinaw - person Ivandro Jao; 22.02.2016

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

person Stephen Cleary    schedule 18.06.2010
comment
Интересно, я никогда не слышал о методах расширения до вашего сообщения. Спасибо за подсказку и за просмотр моего кода - person Frank Hamming; 18.06.2010