मैं कैसे संरचनात्मक प्रणाली को परिवर्तित करता हूँ। बाइट बाइट [] को एक System.IO.Stream ऑब्जेक्ट में C #?


जवाबों:


1284

बाइट को एक स्ट्रीम में बदलने का सबसे आसान तरीका MemoryStreamक्लास का उपयोग कर रहा है :

Stream stream = new MemoryStream(byteArray);

19
कृपया ध्यान दें कि स्ट्रीम बनाने का यह तरीका शायद आदर्श नहीं है: "यह कंस्ट्रक्टर अंतर्निहित स्ट्रीम को उजागर नहीं करता है। GetBuffer अनधिकृत रूप से थिसॉरस को फेंकता है।" msdn.microsoft.com/en-us/library/e55f3s5k.aspx
noocyte

25
@ बेनोइट तो आदर्श तरीका क्या है?
डेवलपर

6
लेकिन आप अभी भी उपयोग कर सकते हैं stream.ToArray()यदि आप अपने बाइट सरणी वापस चाहते हैं।
फ्लोरियन फ़िदा

2
इस तरह की बाइट सरणी से एक धारा बनाने के साथ किस तरह का ओवरहेड जुड़ा हुआ है? मेमोरी उपयोग ज्यादातर मैं क्या सोच रहा हूँ के बारे में है।
जॉकुल

344

तुम MemoryStream.Writeविधि खोज रहे हो ।

उदाहरण के लिए, निम्न कोड एक byte[]सरणी की सामग्री को मेमोरी स्ट्रीम में लिखेगा :

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream();
stream.Write(myByteArray, 0, myByteArray.Length);

वैकल्पिक रूप से, आप बाइट सरणी के आधार पर एक नई , गैर-रिज़र्व करने योग्य MemoryStreamवस्तु बना सकते हैं :

byte[] myByteArray = new byte[10];
MemoryStream stream = new MemoryStream(myByteArray);

26
यह सबसे अच्छा जवाब है। यह संक्षिप्त है और सभी व्यावहारिक अनुप्रयोगों को शामिल करता है। यहाँ संकेत के रूप में बाइट सरणी आधारित निर्माणकर्ता का उपयोग करने के साथ एक गोचा है - परिणामस्वरूप स्ट्रीम फिर से व्यवहार्य नहीं है।
जदुव

17
इसके बाद धारा को रीसेट करने के लिए भी याद रखें: stream.Seek (0, SeekOrigin.Begin);
मिन्ह गुयेन

कृपया ध्यान दें कि पहला विकल्प MemoryStream.Writeअधिक मेमोरी खपत वाला हैnew MemoryStream(myByteArray)
एलेक्स

क्यों, वास्तव में, क्या वह @ जिट है? मुझे किसी भी .NET को किए हुए कई साल हो चुके हैं, इसलिए यदि मैं प्रदर्शन पर टिप्पणी करने के लिए इस उत्तर को अपडेट करने जा रहा हूं, तो मुझे कुछ और जानकारी की आवश्यकता होगी।
कोड़ी ग्रे

2
MemoryStreamडिफ़ॉल्ट रूप से बफर में अतिरिक्त स्थान आवंटित किया गया है (जैसे एक सूची के साथ)। यह आसानी से अधिभार का उपयोग करके निपटाया जा सकता है जो आपको क्षमता निर्धारित करने की अनुमति देता है, लेकिन यह वास्तव में केवल तभी उपयोगी है जब आप स्ट्रीम के किसी भी डेटा को लिखने की उम्मीद नहीं करते हैं (या यदि आप जानते हैं कि आपको कितने अतिरिक्त बाइट्स की आवश्यकता है )। लेकिन मुझे संदेह है कि jitbit इस तथ्य का उल्लेख कर सकता है कि जब आप byte[]कंस्ट्रक्टर का उपयोग करते हैं , तो सरणी की प्रतिलिपि नहीं बनाई जाती है - MemoryStreamतर्क में सरणी को संदर्भित करता है। यह अच्छा और बुरा दोनों हो सकता है, और यह शर्म की बात है कि यह MSDN पर प्रलेखित नहीं है :)
Luaan

32

किसी भी स्ट्रीम को लिखने के लिए सामान्य दृष्टिकोण (न केवल MemoryStream) का उपयोग करना है BinaryWriter:

static void Write(Stream s, Byte[] bytes)
{
    using (var writer = new BinaryWriter(s))
    {
        writer.Write(bytes);
    }
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.