2012-09-28 8 views
5

पर एक स्ट्रीम (System.Net.ConnectStream) को बाइट सरणी में कनवर्ट करने का प्रयास कैसे कर सकता हूं। यह कैसे किया जा सकता है इस पर कोई विचार/उदाहरण?सी # मैं System.Net.ConnectStream को एक बाइट [] (सरणी)

+3

बस एक बफर में इसे पढ़ा ('बाइट []')। एमएसडीएन पर ['Stream.Read'] (http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx) देखें। – Oded

+0

@ ओडेड, हाँ, लेकिन स्ट्रीम की पूरी सामग्री को कॉपी करने का यह एक आसान तरीका नहीं है (जब तक कि आप इसकी लंबाई नहीं जानते, जो हमेशा कनेक्टस्ट्रीम के साथ मामला नहीं है) –

उत्तर

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

इस मामले में आप स्मृति को 3 गुना अधिक आपकी धारा यह बहुत अच्छा नहीं है अगर आपकी स्ट्रीम आपके पीसी की तुलना में अधिक मेमोरी ले सकती है। इस मामले में आपको स्ट्रीम स्ट्रीम का उपयोग करने की आवश्यकता है। स्रोत स्ट्रीम से डेटा के हिस्सों को पढ़ने और इस भाग के साथ काम करने के लिए पढ़ें। –

+0

ध्यान दें कि 'Stream.CopyTo' केवल .NET 4.0 और ऊपर उपलब्ध है। पूर्व 4.0 संस्करण के लिए केविन का जवाब देखें। –

+0

धन्यवाद आदमी! यह काम कर रहा है! @ थॉमस – 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) का उपयोग कर रहे हैं, तो आप '65536' को' 64 << 10' से बदल सकते हैं जहां बायीं तरफ आपकी संख्या है और दाईं ओर है '0 = बाइट्स, 10 = किलोबाइट्स, 20 = मेगाबाइट्स, 30 = गीगाबाइट्स, ect ... 'तो एक 2 एमबी बफर' 2 << 20' –

+0

भी होगा, आप _lock पर क्यों लॉक कर रहे हैं? यदि आप स्ट्रीम में विशेष पहुंच प्राप्त करने का प्रयास कर रहे हैं तो आपको स्ट्रीम से बंधे कुछ (या स्ट्रीम [सिंक्रनाइज़ेड] (http://msdn.microsoft.com/en-us/library/system.io पर कॉल करना चाहिए) पर लॉक होना चाहिए। stream.synchronized.aspx) इसे पारित होने से पहले)। आप अपने कोड में कुछ भी नहीं कर रहे हैं जो टूट जाएगा यदि आप एक ही समय में दो *** अलग *** धाराओं को परिवर्तित करते हैं –

संबंधित मुद्दे