2011-09-24 22 views
16

मेरे पास सममित एन्क्रिप्शन का उपयोग करके डेटा एन्क्रिप्ट करने और डिक्रिप्ट करने के लिए एक एल्गोरिदम है। वैसे भी जब मैं के बारे में डिक्रिप्ट करने के लिए कर रहा हूँ, मेरे पास है:स्ट्रीम से डेटा पढ़ने का सबसे प्रभावी तरीका

CryptoStream cs = new CryptoStream(ms, cryptoTransform, CryptoStreamMode.Read); 

मैं सीएस CryptoStream से डेटा पढ़ने और बाइट्स की एक सरणी में है कि डेटा रखना होगा। तो एक तरीका हो सकता है:

System.Collections.Generic.List<byte> myListOfBytes = new System.Collections.Generic.List<byte>(); 

    while (true) 
    { 
       int nextByte = cs.ReadByte(); 
       if (nextByte == -1) break; 
       myListOfBytes.Add((Byte)nextByte); 
    } 
    return myListOfBytes.ToArray(); 

एक और तकनीक हो सकता है:

ArrayList chuncks = new ArrayList(); 

byte[] tempContainer = new byte[1048576]; 

int tempBytes = 0; 
while (tempBytes < 1048576) 
{ 
    tempBytes = cs.Read(tempContainer, 0, tempContainer.Length); 
    //tempBytes is the number of bytes read from cs stream. those bytes are placed 
    // on the tempContainer array 

    chuncks.Add(tempContainer); 

} 

// later do a for each loop on chunks and add those bytes 

मैं पहले से धारा की लंबाई नहीं पता कर सकते सीएस:

enter image description here

या शायद मैं चाहिए मेरी ढेर वर्ग को लागू करें। मैं जानकारी का एक बहुत कुछ को एनक्रिप्ट किया जाएगा इसलिए इस कोड को कुशल बहुत समय की बचत होगी

उत्तर

42

आप मात्रा में पढ़ सकता है बनाने:

using (var stream = new MemoryStream()) 
{ 
    byte[] buffer = new byte[2048]; // read in chunks of 2KB 
    int bytesRead; 
    while((bytesRead = cs.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     stream.Write(buffer, 0, bytesRead); 
    } 
    byte[] result = stream.ToArray(); 
    // TODO: do something with the result 
} 
+0

अच्छा था कि मैं वास्तव में क्या जरूरत धन्यवाद की आवश्यकता होगी! –

+0

त्वरित प्रश्न ... आपने सब कुछ उपयोग कथन के अंदर क्यों रखा? उपयोग कथन का मतलब क्या है? –

+2

@ टोनो नाम, यह सुनिश्चित करता है कि स्ट्रीम के रूप में पहचानने योग्य संसाधनों की निपटान विधि को किसी भी अप्रबंधित संसाधनों को मुक्त करने के लिए हमेशा बुलाया जाता है जिसे वे अपवाद के मामले में भी पकड़ सकते हैं और इस प्रकार आपके कोड में मेमोरी लीक से बच सकते हैं। यह एक मौलिक अवधारणा है जिसे मैं आपको एमएसडीएन पर पढ़ने के लिए आमंत्रित करता हूं: http://msdn.microsoft.com/en-us/library/yh598w02.aspx इसके अलावा आपको अपने 'CryptoStream' को एक उपयोग कथन में लपेटना चाहिए। –

25

आप स्मृति में सब कुछ भंडारण कर रहे हैं के बाद से वैसे भी आप सिर्फ एक MemoryStream उपयोग कर सकते हैं और CopyTo():

using (MemoryStream ms = new MemoryStream()) 
{ 
    cs.CopyTo(ms); 
    return ms.ToArray(); 
} 

CopyTo() .NET 4

+0

क्रिप्टोस्ट्रीम क्लास में कॉपी टू विधि नहीं है ... –

+0

@ टोनोनाम: .NET 4 में 'CopyTo()' को 'स्ट्रीम' पर परिभाषित किया गया है - सभी स्ट्रीम इसका समर्थन करते हैं, यदि आपका समाधान .NET के पहले संस्करण को निश्चित रूप से उपयोग करता है @ डेरिन समाधान – BrokenGlass

+0

विश्वास नहीं कर सकता मैं इसे अपने पूरे जीवन से चूक गया –

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

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