2012-09-28 48 views
5

im cố gắng chuyển đổi một luồng (System.Net.ConnectStream) thành một mảng byte. Bất kỳ suy nghĩ/ví dụ về cách này có thể được thực hiện?C# Làm thế nào để tôi chuyển đổi System.Net.ConnectStream thành một byte [] (mảng)

+3

Chỉ cần đọc nó vào bộ đệm ('byte []'). Xem ['Stream.Read'] (http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx) trên MSDN. – Oded

+0

@Oded, vâng, nhưng không phải là cách dễ dàng để sao chép toàn bộ nội dung của luồng (trừ khi bạn biết độ dài của nó, không phải lúc nào cũng như trường hợp của ConnectStream) –

Trả lời

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

Trong trường hợp này, bạn sử dụng bộ nhớ nhiều gấp 3 lần luồng của bạn. Nó không phải là quá tốt nếu các dòng của bạn có thể mất nhiều bộ nhớ hơn máy tính của bạn có. Trong trường hợp này, bạn cần sử dụng Stream.Read để đọc các khối dữ liệu từ luồng nguồn và làm việc với các khối này. –

+0

Lưu ý rằng 'Stream.CopyTo' chỉ khả dụng trong .NET 4.0 trở lên. Xem câu trả lời của Kevin cho phiên bản 4.0 trước. –

+0

Cảm ơn người đàn ông! nó hoạt động! @Thomas – Mulaiko

4

Hãy thử này ...

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

Đó là mẹo, nếu bạn đang sử dụng bộ đệm số tròn (ví dụ như 64k trong ví dụ), bạn có thể thay thế '65536' bằng '64 << 10' ở phía bên trái là số của bạn và ở phía bên phải '0 = Byte, 10 = Kilobites, 20 = Megabyte, 30 = Gigabyte, ect ...' Vì vậy, một bộ đệm 2MB sẽ là '2 << 20' –

+0

Ngoài ra, tại sao bạn khóa trên _lock? nếu bạn đang cố gắng để có quyền truy cập độc quyền vào luồng, bạn nên khóa một thứ gì đó gắn với luồng (hoặc gọi [Stream.Synchronized] (http://msdn.microsoft.com/en-us/library/system.io. stream.synchronized.aspx) trước khi nó được truyền vào). Bạn không làm gì trong mã của bạn sẽ bị hỏng nếu bạn chuyển đổi đã thực hiện hai luồng *** khác nhau cùng một lúc –

Các vấn đề liên quan