Как преобразовать struct 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);
    }
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.