Comment puis-je convertir l'octet System.Byte struct [] en un objet System.IO.Stream en C #?

759

Comment convertir une structure System.Byte byte[]en System.IO.Streamobjet en C # ?

Mehdi Hadeli
la source

Réponses:

1286

La façon la plus simple de convertir un tableau d'octets en un flux est d'utiliser la MemoryStreamclasse:

Stream stream = new MemoryStream(byteArray);
Martin Buberl
la source
19
Veuillez noter que cette façon de créer un flux n'est peut-être pas idéale: "Ce constructeur n'expose pas le flux sous-jacent. GetBuffer lève UnauthorizedAccessException." msdn.microsoft.com/en-us/library/e55f3s5k.aspx
noocyte
25
@noocyte quel est le moyen idéal alors?
developerbmw
6
mais vous pouvez toujours l'utiliser stream.ToArray()si vous souhaitez récupérer votre tableau d'octets.
Florian Fida
2
Quel type de surcharge est associé à la construction d'un flux à partir du tableau d'octets comme celui-ci? L'utilisation de la mémoire est principalement ce que je me demande.
jocull
344

Vous cherchez la MemoryStream.Writeméthode .

Par exemple, le code suivant écrira le contenu d'un byte[]tableau dans un flux mémoire:

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

Vous pouvez également créer un nouvelMemoryStream objet non redimensionnable basé sur le tableau d'octets:

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream(myByteArray);
Cody Gray
la source
26
C'est la meilleure réponse. Il est concis et couvre toutes les applications pratiques. Il y a un problème avec l'utilisation du constructeur basé sur un tableau d'octets comme indiqué ici - le flux résultant n'est pas redimensionnable.
Jduv
17
N'oubliez pas non plus de réinitialiser le flux par la suite: stream.Seek (0, SeekOrigin.Begin);
Minh Nguyen du
Veuillez noter que la première option MemoryStream.Writeconsomme alors beaucoup plus de mémoirenew MemoryStream(myByteArray)
Alex
Pourquoi, exactement, est-ce @jitbit? Cela fait de nombreuses années que je n'ai fait aucun .NET, donc si je voulais mettre à jour cette réponse pour commenter les performances, j'aurais besoin de plus d'informations.
Cody Gray
2
Il y a de l'espace supplémentaire alloué dans le MemoryStreamtampon par défaut (comme avec par exemple une liste). Cela peut être traité facilement en utilisant la surcharge qui vous permet de définir la capacité, mais n'est vraiment utile que si vous ne vous attendez pas à écrire des données dans le flux (ou si vous savez de combien d'octets supplémentaires vous aurez probablement besoin ). Mais je soupçonne que jitbit pourrait faire référence au fait que lorsque vous utilisez le byte[]constructeur, le tableau n'est pas copié - le MemoryStreamfait référence au tableau dans l'argument. Cela peut être à la fois bon et mauvais, et c'est un peu dommage qu'il ne soit pas documenté sur MSDN :)
Luaan
32

L'approche générale pour écrire dans n'importe quel flux (pas seulement MemoryStream) consiste à utiliser BinaryWriter:

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

Regardez dans la MemoryStreamclasse.

Corey Ogburn
la source