2012-09-28 12 views
5

Próbuję przekonwertować strumień (System.Net.ConnectStream) na tablicę bajtów. Wszelkie przemyślenia/przykłady na temat tego, jak można to zrobić?C# Jak przekonwertować System.Net.ConnectStream na bajt [] (tablica)

+3

Wystarczy przeczytać ją do bufora ('byte []'). Spójrz na ['Stream.Read'] (http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx) na MSDN. – Oded

+0

@Wykonywane, tak, ale nie jest to bardzo łatwy sposób na skopiowanie całej zawartości strumienia (chyba że znasz jego długość, co nie zawsze ma miejsce w przypadku ConnectStream). –

Odpowiedz

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

W tym przypadku używasz pamięci w 3 razy więcej niż Twój strumień. Nie jest tak dobrze, jeśli twoje strumienie mogą zająć więcej pamięci niż twój komputer. W takim przypadku musisz użyć Stream.Read do odczytywania porcji danych ze strumienia źródłowego i pracy z tymi porcjami. –

+0

Zauważ, że 'Stream.CopyTo' jest dostępne tylko w .NET 4.0 i nowszych. Zobacz odpowiedź Kevina na wersję przed 4.0. –

+0

Dzięki! to działa! @Thomas – Mulaiko

4

Spróbuj tego ...

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

Oto wskazówka, jeśli używasz zaokrąglonego bufora liczbowego (np. 64k w twoim przykładzie), możesz zamienić '65536' na' 64 << 10', gdzie po lewej stronie znajduje się twój numer i po prawej stronie '0 = Bajty, 10 = Kilobites, 20 = Megabajty, 30 = gigabajty, ect ...' Więc bufor 2 MB będzie '2 << 20' –

+0

Również, dlaczego blokujesz _lock? jeśli próbujesz uzyskać wyłączny dostęp do strumienia, powinieneś zablokować coś związanego ze strumieniem (lub wywołać [Stream.Synchronized] (http://msdn.microsoft.com/en-us/library/system.io. stream.synchronized.aspx) zanim zostanie przekazany). Nie robisz nic w swoim kodzie, który by się zepsuł, gdybyś przekonwertował dwa różne *** strumienie w tym samym czasie –

Powiązane problemy