1088 Stimmen

Erstellen eines Byte-Arrays aus einem Stream

Was ist die bevorzugte Methode zur Erstellung eines Byte-Arrays aus einem Eingabestrom?

Hier ist meine aktuelle Lösung mit .NET 3.5.

Stream s;
byte[] b;

using (BinaryReader br = new BinaryReader(s))
{
    b = br.ReadBytes((int)s.Length);
}

Ist es immer noch eine bessere Idee, Teile des Datenstroms zu lesen und zu schreiben?

21voto

Nilesh Kumar Punkte 251

Sie können einfach die Methode ToArray() der Klasse MemoryStream verwenden, z. B.

MemoryStream ms = (MemoryStream)dataInStream;
byte[] imageBytes = ms.ToArray();

14voto

Michal T Punkte 814

Sie können es sogar mit Verlängerungen aufpeppen:

namespace Foo
{
    public static class Extensions
    {
        public static byte[] ToByteArray(this Stream stream)
        {
            using (stream)
            {
                using (MemoryStream memStream = new MemoryStream())
                {
                     stream.CopyTo(memStream);
                     return memStream.ToArray();
                }
            }
        }
    }
}

Und rufen Sie sie dann als reguläre Methode auf:

byte[] arr = someStream.ToByteArray()

8voto

önder çalbay Punkte 53

Kombination von zwei der am häufigsten geäußerten Antworten zu einer Erweiterungsmethode:

public static byte[] ToByteArray(this Stream stream)
{
    if (stream is MemoryStream)
        return ((MemoryStream)stream).ToArray();
    else
    {
        using MemoryStream ms = new();
        stream.CopyTo(ms);
        return ms.ToArray();
    }            
}

8voto

SensorSmith Punkte 1041

Falls es jemandem gefällt, hier ist eine Lösung nur für .NET 4+, die als Erweiterungsmethode ohne den unnötigen Dispose-Aufruf für den MemoryStream gebildet wurde. Dies ist eine hoffnungslos triviale Optimierung, aber es ist erwähnenswert, dass das Scheitern eines Dispose-Aufrufs für einen MemoryStream kein wirklicher Fehler ist.

public static class StreamHelpers
{
    public static byte[] ReadFully(this Stream input)
    {
        var ms = new MemoryStream();
        input.CopyTo(ms);
        return ms.ToArray();
    }
}

8voto

Brian Hinchey Punkte 3481

Ich erhalte einen Kompilierzeitfehler mit dem Code von Bob (d.h. dem Fragesteller). Stream.Length ist ein Long-Wert, während BinaryReader.ReadBytes einen Integer-Parameter benötigt. In meinem Fall erwarte ich nicht, dass ich mit Streams zu tun habe, die groß genug sind, um eine lange Genauigkeit zu erfordern, daher verwende ich Folgendes:

Stream s;
byte[] b;

if (s.Length > int.MaxValue) {
  throw new Exception("This stream is larger than the conversion algorithm can currently handle.");
}

using (var br = new BinaryReader(s)) {
  b = br.ReadBytes((int)s.Length);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X