¿Cómo convierto struct System.Byte byte [] en un objeto System.IO.Stream en C #?

759

¿Cómo convierto la estructura System.Byte byte[]en un System.IO.Streamobjeto en C # ?

Mehdi Hadeli
fuente

Respuestas:

1286

La forma más fácil de convertir una matriz de bytes en una secuencia es usar la MemoryStreamclase:

Stream stream = new MemoryStream(byteArray);
Martin Buberl
fuente
19
Tenga en cuenta que esta forma de crear una secuencia quizás no sea la ideal: "Este constructor no expone la secuencia subyacente. GetBuffer genera una excepción de acceso no autorizado". msdn.microsoft.com/en-us/library/e55f3s5k.aspx
noocyte 01 de
25
@noocito, ¿cuál es la forma ideal entonces?
developerbmw
66
pero aún puede usarlo stream.ToArray()si desea recuperar su matriz de bytes.
Florian Fida
2
¿Qué tipo de sobrecarga se asocia con la construcción de una secuencia a partir de la matriz de bytes como esta? El uso de la memoria es sobre todo lo que me pregunto.
jocull
344

Estás buscando el MemoryStream.Writemétodo .

Por ejemplo, el siguiente código escribirá el contenido de una byte[]matriz en una secuencia de memoria:

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

Alternativamente, puede crear un nuevoMemoryStream objeto no redimensionable basado en la matriz de bytes:

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream(myByteArray);
Cody Gray
fuente
26
Esta es la mejor respuesta. Es conciso y cubre todas las aplicaciones prácticas. Hay un problema con solo usar el constructor basado en matriz de bytes como se indica aquí: la secuencia resultante no es redimensionable.
Jduv
17
También recuerde restablecer la transmisión después: stream.Seek (0, SeekOrigin.Begin);
Minh Nguyen
Tenga en cuenta que la primera opción MemoryStream.Writees mucho más memoria que consume entoncesnew MemoryStream(myByteArray)
Alex
¿Por qué, exactamente, es ese @jitbit? Han pasado muchos años desde que hice cualquier .NET, por lo que si iba a actualizar esta respuesta para comentar sobre el rendimiento, necesitaría más información.
Cody Gray
2
Hay espacio extra asignado en el MemoryStreambúfer por defecto (al igual que con, por ejemplo, una lista). Esto se puede solucionar fácilmente utilizando la sobrecarga que le permite establecer la capacidad, pero solo es realmente útil si no espera escribir ningún dato en la secuencia (o si sabe cuántos bytes adicionales es probable que necesite ) Pero sospecho que jitbit podría estar refiriéndose al hecho de que a cuando usa el byte[]constructor, la matriz no se copia, se MemoryStreamrefiere a la matriz en el argumento. Esto puede ser bueno y malo, y es una pena que no esté documentado en MSDN :)
Luaan
32

El enfoque general para escribir en cualquier flujo (no solo MemoryStream) es usar BinaryWriter:

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