c# - बिट क्या है?




एक धारा से एक बाइट सरणी बनाना (8)

आप इस विस्तार विधि का उपयोग कर सकते हैं।

public static class StreamExtensions
{
    public static byte[] ToByteArray(this Stream stream)
    {
        var bytes = new List<byte>();

        int b;
        while ((b = stream.ReadByte()) != -1)
            bytes.Add((byte)b);

        return bytes.ToArray();
    }
}

इनपुट स्ट्रीम से बाइट सरणी बनाने के लिए पसंदीदा विधि क्या है?

.NET 3.5 के साथ मेरा वर्तमान समाधान यहां है।

Stream s;
byte[] b;

using (BinaryReader br = new BinaryReader(s))
{
    b = br.ReadBytes((int)s.Length);
}

क्या स्ट्रीम के हिस्सों को पढ़ने और लिखना अभी भी एक बेहतर विचार है?


आप एक्सटेंशन के साथ इसे फैनसीयर भी बना सकते हैं:

namespace Foo
{
    public static class Extensions
    {
        public static byte[] ToByteArray(this Stream stream)
        {
            using (stream)
            {
                using (MemoryStream memStream = new MemoryStream())
                {
                     stream.CopyTo(memStream);
                     return memStream.ToArray();
                }
            }
        }
    }
}

और फिर इसे नियमित विधि के रूप में कॉल करें:

byte[] arr = someStream.ToByteArray()

जबकि जॉन का जवाब सही है, वह कोड लिख रहा है जो पहले से ही CopyTo में मौजूद है। तो .Net 4 के लिए संदीप के समाधान का उपयोग करें, लेकिन नेट के पिछले संस्करण के लिए जॉन के जवाब का उपयोग करें। सिपिप के कोड को "उपयोग" के उपयोग से बेहतर किया जाएगा क्योंकि कॉपीटो में अपवाद हैं, कई स्थितियों में, काफी संभावना है और मेमोरीस्ट्रीम को डिस्पोजेक्ट नहीं छोड़ देगा।

public static byte[] ReadFully(Stream input)
{
    using (MemoryStream ms = new MemoryStream())
    {
        input.CopyTo(ms);
        return ms.ToArray();
    }
}

बस मेरे जोड़े सेंट ... मैं जिस अभ्यास का अक्सर उपयोग करता हूं वह इस तरह के तरीकों को एक कस्टम सहायक के रूप में व्यवस्थित करना है

public static class StreamHelpers
{
    public static byte[] ReadFully(this Stream input)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            input.CopyTo(ms);
            return ms.ToArray();
        }
    }
}

कॉन्फ़िगरेशन फ़ाइल में नेमस्पेस जोड़ें और अपनी इच्छानुसार कहीं भी इसका उपयोग करें


मुझे बॉब (यानी प्रश्नकर्ता) कोड के साथ संकलन समय त्रुटि मिलती है। Stream.Length एक लंबा है जबकि BinaryReader.ReadBytes एक पूर्णांक पैरामीटर लेता है। मेरे मामले में, मुझे लंबी परिशुद्धता की आवश्यकता के लिए पर्याप्त धाराओं से निपटने की उम्मीद नहीं है, इसलिए मैं निम्न का उपयोग करता हूं:

Stream s;
byte[] b;

if (s.Length > int.MaxValue) {
  throw new Exception("This stream is larger than the conversion algorithm can currently handle.");
}

using (var br = new BinaryReader(s)) {
  b = br.ReadBytes((int)s.Length);
}

मैं इसे एक पंक्ति पर काम करने में सक्षम था:

byte [] byteArr= ((MemoryStream)localStream).ToArray();

जैसा कि johnnyRose द्वारा स्पष्ट किया गया है, ऊपर कोड केवल johnnyRose लिए काम करेगा


MemoryStream ms = new MemoryStream();
file.PostedFile.InputStream.CopyTo(ms);
var byts = ms.ToArray();
ms.Dispose();

public static byte[] ToByteArray(Stream stream)
    {
        if (stream is MemoryStream)
        {
            return ((MemoryStream)stream).ToArray();
        }
        else
        {
            byte[] buffer = new byte[16 * 1024];
            using (MemoryStream ms = new MemoryStream())
            {
                int read;
                while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
                return ms.ToArray();
            }
        }            
    }




inputstream