Créer un tableau d’octets à partir d’un flux
Source : Stack Overflow,)
Cela dépend vraiment de si vous pouvez faire confiance à s.Length ou non. Pour de nombreux flux, vous ne savez tout simplement pas quelle quantité de données il y aura. Dans de tels cas - et avant .NET 4 - j’utiliserais du code comme celui-ci :
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
Avec .NET 4 et supérieur, j’utiliserais Stream.CopyTo, qui est essentiellement équivalent à la boucle dans mon code - créez le MemoryStream, appelez stream.CopyTo(ms) puis retournez ms.ToArray(). Et voilà.
Je devrais peut-être expliquer pourquoi ma réponse est plus longue que les autres. Stream.Read ne garantit pas qu’il lira tout ce qui lui est demandé. Si vous lisez depuis un flux réseau, par exemple, il pourrait lire la valeur d’un paquet et retourner, même s’il y aura plus de données bientôt. BinaryReader.Read continuera jusqu’à la fin du flux ou jusqu’à votre taille spécifiée, mais vous devez tout de même connaître la taille au départ.
La méthode ci-dessus continuera à lire (et copier dans un MemoryStream) jusqu’à épuisement des données. Elle demande ensuite au MemoryStream de retourner une copie des données dans un tableau. Si vous connaissez la taille au départ - ou pensez connaître la taille, sans en être sûr - vous pouvez construire le MemoryStream avec cette taille au départ. De même, vous pouvez ajouter une vérification à la fin, et si la longueur du flux est la même taille que le tampon (retourné par MemoryStream.GetBuffer), vous pouvez simplement retourner le tampon. Donc le code ci-dessus n’est pas tout à fait optimisé, mais sera au mo
(Réponse tronquée)