Realmente depende de si puedes confiar o no s.Length
. Para muchas transmisiones, simplemente no sabes cuántos datos habrá. En tales casos, y antes de .NET 4, usaría un código como este:
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();
}
}
Con .NET 4 y superior, usaría Stream.CopyTo
, que es básicamente equivalente al bucle en mi código: crear MemoryStream
, llamar stream.CopyTo(ms)
y luego regresar ms.ToArray()
. Trabajo hecho.
Quizás debería explicar por qué mi respuesta es más larga que las otras. Stream.Read
no garantiza que leerá todo lo que se le solicite. Si está leyendo desde una transmisión de red, por ejemplo, puede leer el valor de un paquete y luego regresar, incluso si habrá más datos pronto. BinaryReader.Read
continuará hasta el final de la transmisión o el tamaño especificado, pero aún debe saber el tamaño para comenzar.
El método anterior seguirá leyendo (y copiando en a MemoryStream
) hasta que se quede sin datos. Luego le pide MemoryStream
que devuelva una copia de los datos en una matriz. Si conoce el tamaño para comenzar, o cree que conoce el tamaño, sin estar seguro, puede construir el MemoryStream
tamaño para comenzar. Del mismo modo, puede marcar al final, y si la longitud de la secuencia es del mismo tamaño que el búfer (devuelto por MemoryStream.GetBuffer
), puede devolver el búfer. Entonces, el código anterior no está optimizado, pero al menos será correcto. No asume ninguna responsabilidad por cerrar la transmisión; la persona que llama debe hacerlo.
Consulte este artículo para obtener más información (y una implementación alternativa).