2012-09-28 11 views
5

Estoy tratando de convertir una secuencia (System.Net.ConnectStream) en una matriz de bytes. ¿Alguna idea/ejemplo sobre cómo se puede hacer esto?C# Cómo convierto System.Net.ConnectStream en un byte [] (matriz)

+3

acaba de leer en una memoria tampón ('byte [] '). Mire ['Stream.Read'] (http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx) en MSDN. – Oded

+0

@Oded, sí, pero no es una manera muy fácil de copiar todo el contenido de la transmisión (a menos que sepa su longitud, que no siempre es el caso con ConnectStream) –

Respuesta

12
Stream sourceStream = ... // the ConnectStream 
byte[] array; 
using (var ms = new MemoryStream()) 
{ 
    sourceStream.CopyTo(ms); 
    array = ms.ToArray(); 
} 
+0

En este caso, utiliza la memoria en 3 veces más que tu corriente No es tan bueno si tus transmisiones pueden tomar más memoria que tu computadora. En este caso, debe usar Stream.Read para leer fragmentos de datos de la fuente de flujo y trabajar con estos fragmentos. –

+0

Tenga en cuenta que 'Stream.CopyTo' solo está disponible en .NET 4.0 y versiones posteriores. Vea la respuesta de Kevin para una versión anterior a la 4.0. –

+0

Gracias hombre! ¡esta funcionando! @Thomas – Mulaiko

4

Prueba esto ...

private static readonly object _lock = new object(); 

    public static byte[] readFullStream(Stream st) 
    { 
     try 
     { 
      Monitor.Enter(_lock); 
      byte[] buffer = new byte[65536]; 
      Int32 bytesRead; 
      MemoryStream ms = new MemoryStream(); 
      bool finished = false; 
      while (!finished) 
      { 
       bytesRead = st.Read(buffer.Value, 0, buffer.Length); 
       if (bytesRead > 0) 
       { 
        ms.Write(buffer.Value, 0, bytesRead); 
       } 
       else 
       { 
        finished = true; 
       } 
      } 
      return ms.ToArray(); 
     } 
     finally 
     { 
      Monitor.Exit(_lock); 
     } 
    } 
+1

Aquí hay una sugerencia, si está utilizando un buffer de número redondeado (como 64k en su ejemplo), puede reemplazar '65536' con' 64 << 10' donde el lado izquierdo es su número y en el lado derecho '0 = Bytes, 10 = Kilobites, 20 = Megabytes, 30 = Gigabytes, ect ...' Así que un búfer de 2MB sería '2 << 20' –

+0

Además, ¿por qué está bloqueando _lock? Si está tratando de obtener acceso exclusivo a la transmisión, debe bloquear algo relacionado con la transmisión (o invocar [Stream.Synchronized] (http://msdn.microsoft.com/en-us/library/system.io). stream.synchronized.aspx) antes de que se pase). No está haciendo nada en su código que se rompería si convirtiera dos *** flujos de *** diferentes al mismo tiempo –

Cuestiones relacionadas