Как преобразовать struct System.Byte byte [] в объект System.IO.Stream в C #?

759

Как мне преобразовать структуру System.Byte byte[]в System.IO.Streamобъект в C # ?

Мехди Хадели
источник

Ответы:

1286

Самый простой способ преобразовать байтовый массив в поток - использовать MemoryStreamкласс:

Stream stream = new MemoryStream(byteArray);
Мартин Буберл
источник
19
Обратите внимание, что этот способ создания потока, возможно, не идеален: «Этот конструктор не предоставляет базовый поток. GetBuffer создает исключение UnauthorizedAccessException». msdn.microsoft.com/en-us/library/e55f3s5k.aspx
13
25
@noocyte какой тогда идеальный путь?
developerbmw
6
но вы все равно можете использовать, stream.ToArray()если хотите вернуть свой байтовый массив.
Флориан Фида
2
Какие издержки связаны с созданием потока из байтового массива, подобного этому? Использование памяти в основном то, что мне интересно.
jocull
344

Вы ищете MemoryStream.Writeметод .

Например, следующий код запишет содержимое byte[]массива в поток памяти:

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream();
stream.Write(myByteArray, 0, myByteArray.Length);

В качестве альтернативы вы можете создать новыйMemoryStream объект без изменения размера на основе байтового массива:

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream(myByteArray);
Коди Грей
источник
26
Это лучший ответ. Это краткое и охватывает все практические применения. Здесь есть проблема с использованием конструктора на основе байтового массива, как указано здесь, - результирующий поток не может быть изменен.
Jduv
17
Также не забудьте сбросить поток позже: stream.Seek (0, SeekOrigin.Begin);
Мин Нгуен
Обратите внимание, что первый вариант MemoryStream.Writeпотребляет гораздо больше памяти, чемnew MemoryStream(myByteArray)
Alex
Почему именно @jitbit? Прошло много лет с тех пор, как я сделал какой-либо .NET, поэтому, если я собираюсь обновить этот ответ, чтобы прокомментировать производительность, мне нужно больше информации.
Коди Грей
2
По MemoryStreamумолчанию в буфере выделено дополнительное пространство (как, например, со списком). Эту проблему можно легко решить, используя перегрузку, которая позволяет вам устанавливать емкость, но она действительно полезна, если вы не планируете записывать какие-либо данные в поток (или если вы знаете, сколько дополнительных байтов вам понадобится ). Но я подозреваю, что jitbit может ссылаться на тот факт, что когда вы используете byte[]конструктор, массив не копируется - MemoryStreamссылка на массив в аргументе. Это может быть как хорошо, так и плохо, и это немного обидно, это не задокументировано в MSDN :)
Luaan
32

Общий подход для записи в любой поток (не только MemoryStream) заключается в использовании BinaryWriter:

static void Write(Stream s, Byte[] bytes)
{
    using (var writer = new BinaryWriter(s))
    {
        writer.Write(bytes);
    }
}
QrystaL
источник