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

759

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

Mehdi Hadeli
quelle

Antworten:

1286

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

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

Schau in die MemoryStreamKlasse.

Corey Ogburn
quelle