Como faço para converter struct System.Byte byte [] em um objeto System.IO.Stream em C #?


759

Como faço para converter struct System.Byte byte[]em um System.IO.Streamobjeto em c # ?

Respostas:


1286

A maneira mais fácil de converter uma matriz de bytes em um fluxo é usando a MemoryStreamclasse:

Stream stream = new MemoryStream(byteArray);

19
Observe que essa maneira de criar um fluxo talvez não seja ideal: "Este construtor não expõe o fluxo subjacente. GetBuffer lança UnauthorizedAccessException." msdn.microsoft.com/en-us/library/e55f3s5k.aspx
noocyte

25
@noocyte qual é a maneira ideal então?
developerbmw

6
mas você ainda pode usá- stream.ToArray()lo se quiser recuperar sua matriz de bytes.
Florian Fida

2
Que tipo de sobrecarga está associada à construção de um fluxo a partir da matriz de bytes assim? O uso da memória é principalmente o que estou pensando.
jocull

344

Você está procurando o MemoryStream.Writemétodo .

Por exemplo, o código a seguir gravará o conteúdo de uma byte[]matriz em um fluxo de memória:

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

Como alternativa, você pode criar um novoMemoryStream objeto não redimensionável com base na matriz de bytes:

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

26
Esta é a melhor resposta. É conciso e abrange todas as aplicações práticas. Existe um problema em usar apenas o construtor baseado em array de bytes, conforme indicado aqui - o fluxo resultante não é redimensionável.
JDuv #

17
Lembre-se também de redefinir o fluxo posteriormente: stream.Seek (0, SeekOrigin.Begin);
Minh Nguyen

Por favor, note que a primeira opção MemoryStream.Writeé muito mais memória consome entãonew MemoryStream(myByteArray)
Alex

Por que exatamente é esse @jitbit? Já se passaram muitos anos desde que eu criei um .NET. Portanto, se eu atualizasse esta resposta para comentar sobre o desempenho, precisaria de mais informações.
Cody Gray

2
Há espaço extra alocado no MemoryStreambuffer por padrão (assim como, por exemplo, em uma lista). Isso pode ser resolvido facilmente usando a sobrecarga que permite definir capacidade, mas só é realmente útil se você não espera gravar dados no fluxo (ou se você sabe quantos bytes extras provavelmente precisará ) Mas suspeito que jitbit possa estar se referindo ao fato de que, quando você usa o byte[]construtor, a matriz não é copiada - MemoryStreamrefere-se à matriz no argumento. Isso pode ser bom e ruim, e é um pouco de uma vergonha que não está documentada no MSDN :)
Luaan

32

A abordagem geral para gravar em qualquer fluxo (não apenas MemoryStream) é usar BinaryWriter:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.