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

759

Bagaimana cara mengkonversi struct System.Byte byte[]ke System.IO.Streamobjek di C # ?

Mehdi Hadeli
sumber

Jawaban:

1286

Cara termudah untuk mengkonversi array byte ke stream menggunakan MemoryStreamkelas:

Stream stream = new MemoryStream(byteArray);
Martin Buberl
sumber
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);
Cody Grey
sumber
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);
    }
}
QrystaL
sumber
5

Lihatlah ke dalam MemoryStreamkelas.

Corey Ogburn
sumber