Wie konvertiere ich struct System.Byte byte [] in ein System.IO.Stream-Objekt in C #?


Antworten:


1286

Der einfachste Weg, ein Byte-Array in einen Stream zu konvertieren, ist die Verwendung der MemoryStreamKlasse:

Stream stream = new MemoryStream(byteArray);

19
Beachten Sie, dass diese Art der Erstellung eines Streams möglicherweise nicht ideal ist: "Dieser Konstruktor macht den zugrunde liegenden Stream nicht verfügbar. GetBuffer löst eine UnauthorizedAccessException aus." msdn.microsoft.com/en-us/library/e55f3s5k.aspx
noocyte

25
@noocyte was ist dann der ideale Weg?
Developerbmw

6
Sie können es jedoch weiterhin verwenden, stream.ToArray()wenn Sie Ihr Byte-Array zurückhaben möchten.
Florian Fida

2
Welche Art von Overhead ist mit dem Erstellen eines Streams aus dem Byte-Array wie diesem verbunden? Die Speichernutzung ist hauptsächlich das, worüber ich mich wundere.
Jocull

344

Sie suchen nach der MemoryStream.WriteMethode .

Der folgende Code schreibt beispielsweise den Inhalt eines byte[]Arrays in einen Speicherstrom:

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

Alternativ können Sie ein neuesMemoryStream Objekt ohne Größenänderung basierend auf dem Byte-Array erstellen :

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

26
Dies ist die beste Antwort. Es ist prägnant und deckt alle praktischen Anwendungen ab. Es gibt ein Problem, wenn nur der hier angegebene Konstruktor auf Byte-Array-Basis verwendet wird - der resultierende Stream kann nicht in der Größe geändert werden.
Jduv

17
Denken Sie auch daran, den Stream anschließend zurückzusetzen: stream.Seek (0, SeekOrigin.Begin);
Minh Nguyen

Bitte beachten Sie, dass die erste Option MemoryStream.Writeviel mehr Speicher verbraucht alsnew MemoryStream(myByteArray)
Alex

Warum genau ist das @jitbit? Es ist viele Jahre her, seit ich .NET gemacht habe. Wenn ich diese Antwort aktualisieren würde, um die Leistung zu kommentieren, würde ich weitere Informationen benötigen.
Cody Gray

2
MemoryStreamStandardmäßig ist im Puffer zusätzlicher Speicherplatz zugewiesen (genau wie bei einer Liste). Dies kann leicht mithilfe der Überlastung behoben werden, mit der Sie die Kapazität einstellen können. Sie ist jedoch nur dann wirklich nützlich, wenn Sie nicht erwarten, Daten in den Stream zu schreiben (oder wenn Sie wissen, wie viele zusätzliche Bytes Sie wahrscheinlich benötigen ). Ich vermute jedoch, dass sich jitbit möglicherweise auf die Tatsache bezieht, dass bei Verwendung des byte[]Konstruktors das Array nicht kopiert wird - dies MemoryStreambezieht sich auf das Array im Argument. Dies kann sowohl gut als auch schlecht sein, und es ist ein bisschen schade, dass es nicht auf MSDN dokumentiert ist :)
Luaan

32

Der allgemeine Ansatz zum Schreiben in einen Stream (nicht nur MemoryStream) besteht darin, Folgendes zu verwenden BinaryWriter:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.