Лучший способ конвертировать поток (неизвестной длины) в байтовый массив в .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. Спасибо!
Ответы
Ответ 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
Похоже, ваше текущее решение довольно хорошее. Вы можете рассмотреть возможность его включения в метод расширения, если вы хотите, чтобы код выглядел более чистым.