Bagaimana cara mengonversi struct System.Byte byte [] ke objek System.IO.Stream di C #?


Jawaban:


1286

Cara termudah untuk mengkonversi array byte ke stream menggunakan MemoryStreamkelas:

Stream stream = new MemoryStream(byteArray);

19
Harap perhatikan bahwa cara membuat aliran ini mungkin tidak ideal: "Konstruktor ini tidak mengekspos aliran yang mendasarinya. GetBuffer melempar UnauthorizedAccessException." msdn.microsoft.com/en-us/library/e55f3s5k.aspx
noocyte

25
@noocyte lalu bagaimana cara yang ideal?
developerbmw

6
tetapi Anda masih dapat menggunakan stream.ToArray()jika Anda ingin kembali byte array Anda.
Florian Fida

2
Apa jenis overhead yang terkait dengan membangun aliran dari array byte seperti ini? Penggunaan memori sebagian besar adalah apa yang saya pikirkan.
jocull

344

Anda sedang mencari MemoryStream.Writemetode .

Misalnya, kode berikut akan menulis konten byte[]array ke aliran memori:

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

Atau, Anda bisa membuat objek baru yang tidak bisa diubah ukurannya MemoryStreamberdasarkan array byte:

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream(myByteArray);

26
Ini jawaban terbaik. Ini ringkas dan mencakup semua aplikasi praktis. Ada gotcha dengan hanya menggunakan konstruktor berbasis byte array seperti yang ditunjukkan di sini - aliran yang dihasilkan tidak cukup besar.
Jduv

17
Juga ingat untuk mengatur ulang aliran sesudahnya: stream.Seek (0, SeekOrigin.Begin);
Minh Nguyen

Harap dicatat bahwa opsi pertama MemoryStream.Writelebih memakan memorinew MemoryStream(myByteArray)
Alex

Mengapa, tepatnya, itu @ jitbit? Sudah bertahun- tahun sejak saya melakukan .NET, jadi jika saya akan memperbarui jawaban ini untuk mengomentari kinerja, saya perlu informasi lebih lanjut.
Cody Grey

2
Ada ruang tambahan yang dialokasikan di MemoryStreambuffer secara default (seperti halnya misalnya daftar). Ini dapat diatasi dengan mudah dengan menggunakan kelebihan yang memungkinkan Anda untuk mengatur kapasitas, tetapi hanya sangat berguna jika Anda tidak berharap untuk menulis data apa pun ke aliran (atau jika Anda tahu berapa banyak byte ekstra yang mungkin Anda perlukan ). Tapi saya curiga bahwa jitbit mungkin merujuk pada fakta bahwa ketika Anda menggunakan byte[]konstruktor, array tidak disalin - MemoryStreammerujuk ke array dalam argumen. Ini bisa baik dan buruk, dan sedikit memalukan itu tidak didokumentasikan di MSDN :)
Luaan

32

Pendekatan umum untuk menulis ke aliran apa pun (tidak hanya MemoryStream) adalah dengan menggunakan BinaryWriter:

static void Write(Stream s, Byte[] bytes)
{
    using (var writer = new BinaryWriter(s))
    {
        writer.Write(bytes);
    }
}

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.