Struct System.Byte bayt [] C # bir System.IO.Stream nesnesine nasıl dönüştürebilirim?


759

Yapıyı C # ' daki System.Byte byte[]bir System.IO.Streamnesneye nasıl dönüştürebilirim ?

Yanıtlar:


1285

Bayt dizisini bir akışa dönüştürmenin en kolay yolu MemoryStreamsınıfı kullanmaktır :

Stream stream = new MemoryStream(byteArray);

19
Bir akış oluşturma yönteminin belki de ideal olmadığını lütfen unutmayın: "Bu oluşturucu temel akışı göstermez. GetBuffer UnauthorizedAccessException özel durumunu oluşturur." msdn.microsoft.com/tr-tr/library/e55f3s5k.aspx
noocyte

25
@noocyte o zaman ideal yol nedir?
developerbmw

6
ancak stream.ToArray()bayt dizinizi geri istiyorsanız yine de kullanabilirsiniz .
Florian Fida

2
Bayt dizisinden böyle bir akış oluşturmakla ne tür bir ek yük ilişkilidir? Bellek kullanımı çoğunlukla merak ediyorum.
jocull

344

MemoryStream.WriteYöntemi arıyorsunuz .

Örneğin, aşağıdaki kod bir byte[]dizinin içeriğini bir bellek akışına yazar:

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

Alternatif olarak, bayt dizisine dayalı olarak yeni , yeniden boyutlandırılamayan bir MemoryStreamnesne oluşturabilirsiniz :

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

26
Bu en iyi cevap. Kısa ve tüm pratik uygulamaları kapsar. Burada belirtildiği gibi sadece bayt dizisi tabanlı yapıcıyı kullanarak bir gotcha var - ortaya çıkan akış yeniden boyutlandırılamaz.
Jduv

17
Daha sonra akışı sıfırlamayı da unutmayın: stream.Seek (0, SeekOrigin.Begin);
Minh Nguyen

İlk seçeneğin MemoryStream.Writeo zamandan çok daha fazla bellek harcadığını lütfen unutmayınnew MemoryStream(myByteArray)
Alex

Neden tam olarak bu @jitbit? Bu oldu , birçok herhangi .NET yaptım beri performansı üzerindeki yorumun için bu cevabı güncellemek için gittiğini eğer öyleyse, ben biraz daha bilgi gerekirdi yıl.
Cody Gray

2
Tamponda MemoryStreamvarsayılan olarak ayrılan fazla alan vardır (örneğin bir listede olduğu gibi). Bu, kapasiteyi ayarlamanıza izin veren aşırı yükü kullanarak kolayca çözülebilir, ancak yalnızca akışa herhangi bir veri yazmayı beklemiyorsanız (veya ne kadar ekstra bayta ihtiyacınız olduğunu biliyorsanız) gerçekten yararlıdır. ). Ancak, jitbit'in yapıcıyı kullandığınızda byte[], dizinin kopyalanmadığı gerçeğine atıfta bulunabileceğinden şüpheleniyorum - MemoryStreamargümandaki diziye başvuruyor. Bu hem iyi hem de kötü olabilir ve MSDN'de belgelenmemiş bir utanç :) :)
Luaan

32

Herhangi bir akışa yazmak için genel yaklaşım (sadece değil MemoryStream) aşağıdakileri kullanmaktır BinaryWriter:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.