को डिकंप्रेस नहीं करेगा। मुझे .net में छवियों को संपीड़ित करने के तरीके की आवश्यकता थी, इसलिए मैंने .NET GZipStream क्लास (या DeflateStream) का उपयोग करने में देखा। हालांकि मुझे पता चला कि डिकंप्रेशन हमेशा सफल नहीं होता था, कभी-कभी छवियों को ठीक से डिकंप्रेस कर दिया जाएगा और दूसरी बार मुझे एक जीडीआई + त्रुटि मिलेगी जो कुछ दूषित हो गया है।GZipStream और DeflateStream सभी बाइट्स
इस मुद्दे की जांच करने के बाद मैंने पाया कि डिकंप्रेशन इसे संकुचित सभी बाइट्स वापस नहीं दे रहा था। तो अगर मैंने 2257974 बाइट्स को संपीड़ित किया तो मैं कभी-कभी केवल 2257870 बाइट्स (वास्तविक संख्या) वापस प्राप्त करूंगा।
सबसे मजेदार बात यह है कि कभी-कभी यह काम करेगा। इसलिए मैंने इस छोटी टेस्ट विधि को बनाया जो केवल 10 बाइट्स को संपीड़ित करता है और अब मुझे कुछ भी वापस नहीं मिलता है।
मैंने इसे संपीड़न कक्षाओं GZipStream और DeflateStream दोनों के साथ करने की कोशिश की और मैंने संभावित त्रुटियों के लिए अपना कोड दोहराया। मैंने स्ट्रीम को 0 पर स्थानांतरित करने और सभी धाराओं को फ़्लश करने की कोशिश की लेकिन बिना किसी किस्मत के। आप सभी डेटा आप सेक करना चाहते हैं जोड़ने के बाद Close()
ZipStream
की जरूरत
public static void TestCompression()
{
byte[] test = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
byte[] result = Decompress(Compress(test));
// This will fail, result.Length is 0
Debug.Assert(result.Length == test.Length);
}
public static byte[] Compress(byte[] data)
{
var compressedStream = new MemoryStream();
var zipStream = new GZipStream(compressedStream, CompressionMode.Compress);
zipStream.Write(data, 0, data.Length);
return compressedStream.ToArray();
}
public static byte[] Decompress(byte[] data)
{
var compressedStream = new MemoryStream(data);
var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress);
var resultStream = new MemoryStream();
var buffer = new byte[4096];
int read;
while ((read = zipStream.Read(buffer, 0, buffer.Length)) > 0) {
resultStream.Write(buffer, 0, read);
}
return resultStream.ToArray();
}
अपनी टिप्पणी दो - यह विभिन्न स्तरों पर बफर के लिए नीचे आता है; अगर वे सभी खाली नहीं हैं (सही क्रम में) तो आपको सभी डेटा नहीं मिलते हैं। –
नोट, उदाहरण के लिए, मैंने मेमोरीस्ट्रीम पर बंद() को कॉल करने से परेशान नहीं किया - इसलिए मैं आंशिक रूप से सहमत हूं ;-p –
मैं इस पर भी एक अपडेट जोड़ूंगा .... –