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


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);

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);

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);
    }
}

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.