2012-09-28 39 views
5

即時嘗試將流(System.Net.ConnectStream)轉換爲字節數組。任何關於如何做這件事的想法/例子?C#如何將System.Net.ConnectStream轉換爲字節[](數組)

+3

剛剛讀入緩衝區('字節[]')。在MSDN上查看['Stream.Read'](http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx)。 – Oded

+0

@Oded,是的,但它並不是一個很簡單的方法來複制整個流的內容(除非你知道它的長度,ConnectStream並不總是這樣) –

回答

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

在這種情況下,你使用內存的次數超過3次你的流。如果你的流可以比你的電腦擁有更多的內存,那就不太好了。在這種情況下,您需要使用Stream.Read從源碼流中讀取數據塊並使用這些塊。 –

+0

請注意'Stream.CopyTo'僅在.NET 4.0及更高版本中可用。請參閱凱文的4.0版之前的答案。 –

+0

謝謝你!它的工作! @Thomas – Mulaiko

4

嘗試......

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

繼承人提示,如果你使用的是舍入數字緩衝區(例如你的例子中的64k),你可以用'64 << 10'代替'65536',左邊是你的號碼,右邊是'0 =字節,10 =千葉,20 =兆字節,30 =千兆字節,等等......'所以一個2MB的緩衝區就是'2 << 20' –

+0

另外,你爲什麼鎖定_lock?如果您試圖獲得流的獨佔訪問權限,則應該鎖定與流綁定的內容(或者調用[Stream.Synchronized](http://msdn.microsoft.com/zh-cn/library/system.io)。 stream.synchronized.aspx)在傳入之前)。如果您在同一時間轉換了兩個不同的***流,那麼您的代碼中沒有任何操作會中斷 –

相關問題