Y a-t-il une façon simple ou une méthode pour convertir un dans un
en c# ?
- Création d’un tableau d’octets dans un flux (5 réponses )
Réponses
Trop de publicités?Pratique, la fonction d'assistance à avoir est la suivante:
public static void CopyStream(Stream input, Stream output)
{
byte[] b = new byte[32768];
int r;
while ((r = input.Read(b, 0, b.Length)) > 0)
output.Write(b, 0, r);
}
Ensuite l'utiliser pour copier à un MemoryStream
et appelez - GetBuffer
sur:
Stream file = new FileStream("c:\\foo.txt", FileMode.Open);
MemoryStream mem = new MemoryStream();
CopyStream(file, mem);
// getting the internal buffer (no additional copying)
byte[] buffer = mem.GetBuffer();
long length = mem.Length; // the actual length of the data
// (the array may be longer)
// if you need the array to be exactly as long as the data
byte[] truncated = mem.ToArray(); // makes another copy
Edit: à l'origine, j'ai suggéré à l'aide de Jason réponse à un Stream
qui prend en charge l' Length
de la propriété. Mais il avait un défaut, car elle suppose que l' Stream
serait de retour l'ensemble de son contenu dans un seul Read
, ce qui n'est pas nécessairement vrai (et non pour un Socket
, par exemple). Je ne sais pas si il y a un exemple d'un Stream
de la mise en œuvre de la BCL qui prend en charge Length
mais peut renvoyer les données en plus petits morceaux que vous demandez, mais comme n'importe qui peut hériter Stream
cela pourrait facilement être le cas.
Il est probablement plus simple pour la plupart des cas à utiliser au-dessus de la solution générale, mais en supposant que vous ne voulez le lire directement dans un tableau, c'est - bigEnough
:
byte[] b = new byte[bigEnough];
int r, offset;
while ((r = input.Read(b, offset, b.Length - offset)) > 0)
offset += r;
C'est, de l'appeler à plusieurs reprises Read
et déplacer la position vous permettra de stocker les données.