Як перетворити структуру байта System.Byte [] в об'єкт System.IO.Stream в C #?


Відповіді:


1284

Найпростіший спосіб перетворення байтового масиву в потік - це використання MemoryStreamкласу:

Stream stream = new MemoryStream(byteArray);

19
Зауважте, що такий спосіб створення потоку, можливо, не є ідеальним: "Цей конструктор не виставляє основний потік. GetBuffer кидає UnauthorizedAccessException." msdn.microsoft.com/en-us/library/e55f3s5k.aspx
нооцит

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);
Minh Nguyen

Зверніть увагу, що перший варіант MemoryStream.Writeнабагато більше споживає пам'ять тодіnew MemoryStream(myByteArray)
Алекс

Чому саме це @jitbit? Минуло багато років, як я зробив будь-який .NET, тому, якщо я збирався оновити цю відповідь, щоб прокоментувати продуктивність, мені знадобиться додаткова інформація.
Коді Грей

2
У MemoryStreamбуфері за замовчуванням виділено додатковий простір (як, наприклад, список). З цим легко впоратися, використовуючи перевантаження, що дозволяє встановити потужність, але це дуже корисно, лише якщо ви не розраховуєте записувати будь-які дані в потік (або якщо ви знаєте, скільки зайвих байтів вам, можливо, знадобиться ). Але я підозрюю, що jitbit може посилатися на той факт, що, коли ви використовуєте byte[]конструктор, масив не копіюється - MemoryStreamпосилається на масив в аргументі. Це може бути і добре, і погано, і це шкода, що це не зафіксовано в MSDN :)
Луань

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.