2010-06-18 40 views
13

tengo el siguiente código para leer los datos de una corriente (en este caso, de una tubería con nombre) y en una matriz de bytes:¿La mejor manera de convertir Stream (de longitud desconocida) a una matriz de bytes, en .NET?

// NPSS is an instance of NamedPipeServerStream 

int BytesRead; 
byte[] StreamBuffer = new byte[BUFFER_SIZE]; // size defined elsewhere (less than total possible message size, though) 
MemoryStream MessageStream = new MemoryStream(); 

do 
{ 
    BytesRead = NPSS.Read(StreamBuffer, 0, StreamBuffer.Length); 
    MessageStream.Write(StreamBuffer, 0, BytesRead); 
} while (!NPSS.IsMessageComplete); 

byte[] Message = MessageStream.ToArray(); // final data 

Podría eche un vistazo y quiero saber si puede ser hecho de manera más eficiente o ordenada? Parece un poco complicado como es, usando un MemoryStream. ¡Gracias!

Respuesta

18

Descaradamente copiado de Jon Skeet's article.

public static byte[] ReadFully (Stream stream) 
{ 
    byte[] buffer = new byte[32768]; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     while (true) 
     { 
      int read = stream.Read (buffer, 0, buffer.Length); 
      if (read <= 0) 
       return ms.ToArray(); 
      ms.Write (buffer, 0, read); 
     } 
    } 
} 
+1

Esto se lee hasta el final de la secuencia, pero la intención es leer solo hasta 'IsMessageComplete'. –

+1

Gracias por el enlace al artículo; parece que estoy haciendo casi el mismo algoritmo pero con una condición de terminación diferente en el ciclo. –

+1

Gracias. Me ayuda a resolver mi problema. – nvtthang

0

Parece que su solución actual es bastante buena. Puede considerar envolverlo en un método de extensión si desea que el código se vea más limpio.

+0

Interesante, nunca había escuchado acerca de los métodos de extensión antes de su publicación. Gracias por la sugerencia y por mirar mi código –

3
int read = stream.Read (buffer, 0, buffer.Length); 

Esta línea se bloqueará para siempre si no hay datos disponibles. Leer es una función de bloqueo y bloqueará el hilo hasta que lea al menos un byte, pero si no hay datos bloqueará para siempre.

+0

@ derek-beattie ¿cómo puedo producir estos problemas? –

+0

@IvandroIsmael abhinaw respondió esto –

+0

Oh, lo siento compañero Derek-Beattie./cc @abhinaw –

Cuestiones relacionadas