Come posso convertire struct System.Byte byte [] in un oggetto System.IO.Stream in C #?


759

Come faccio a convertire struct System.Byte byte[]in un System.IO.Streamoggetto in C # ?

Risposte:


1286

Il modo più semplice per convertire un array di byte in un flusso è utilizzare la MemoryStreamclasse:

Stream stream = new MemoryStream(byteArray);

19
Si noti che questo modo di creare uno stream non è forse l'ideale: "Questo costruttore non espone lo stream sottostante. GetBuffer genera UnauthorizedAccessException." msdn.microsoft.com/en-us/library/e55f3s5k.aspx
noociti

25
@noocyte qual è il modo ideale allora?
Developerbmw,

6
ma puoi comunque usare stream.ToArray()se vuoi riavere l'array di byte.
Florian Fida,

2
Che tipo di overhead è associato alla costruzione di un flusso dall'array di byte in questo modo? L'uso della memoria è principalmente quello che mi chiedo.
Giovedì

344

Stai cercando il MemoryStream.Writemetodo .

Ad esempio, il codice seguente scriverà il contenuto di un byte[]array in un flusso di memoria:

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

In alternativa, è possibile creare un nuovoMemoryStream oggetto non ridimensionabile basato sull'array di byte:

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

26
Questa è la risposta migliore È conciso e copre tutte le applicazioni pratiche. C'è un gotcha che usa semplicemente il costruttore basato su array di byte come indicato qui - il flusso risultante non è ridimensionabile.
Jduv,

17
Ricorda anche di reimpostare lo stream in seguito: stream.Seek (0, SeekOrigin.Begin);
Minh Nguyen,

Si noti che la prima opzione MemoryStream.Writerichiede molta più memoria, quindinew MemoryStream(myByteArray)
Alex

Perché, esattamente, è @jitbit? Sono passati molti anni da quando ho fatto qualsiasi NET, quindi se avessi intenzione di aggiornare questa risposta per commentare le prestazioni, avrei bisogno di ulteriori informazioni.
Cody Grey

2
C'è spazio extra allocato nel MemoryStreambuffer di default (proprio come ad esempio con un elenco). Questo può essere risolto facilmente usando il sovraccarico che ti consente di impostare la capacità, ma è davvero utile solo se non ti aspetti di scrivere dati sullo stream (o se sai di quanti byte extra probabilmente avrai bisogno ). Ma ho il sospetto che jitbit potrebbe riferirsi al fatto che a quando si utilizza il byte[]costruttore, l'array non viene copiato - si MemoryStreamriferisce all'array nell'argomento. Questo può essere sia buono che cattivo, ed è un po 'un peccato che non sia documentato su MSDN :)
Luaan

32

L'approccio generale per scrivere su qualsiasi flusso (non solo MemoryStream) è usare BinaryWriter:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.