[
  {
    "Id": "425186",
    "ThreadId": "207718",
    "Html": "<p>Hi,</p>\r\n<p>I was having some problems the ZlibStream class where it&nbsp;was raising an exception while&nbsp;decompressing a stream and after looking into it,&nbsp;it looks like there are some cases where it can't decompress a byte array&nbsp;even when the data was previously compresssed using ZlibStream. I don't know whether I'm just doing something wrong, but I've managed to distill the problem out to the code below which&nbsp;creates a random buffer&nbsp;that throws an exception when it&nbsp;compress it and subsequently tries to decompress it. Strangely, some buffers&nbsp;only fail when using&nbsp;<span style=\"font-size:x-small\">UncompressBuffer and some only fail when using&nbsp;</span><span style=\"font-size:x-small\">ZlibStream.Write with&nbsp;</span><span style=\"font-size:x-small\">CompressionMode = Decompress.</span></p>\r\n<p>If you run the TestRoundtrips code below you'll get a &quot;Bad state (incorrect data check)&quot; exception in the first call to my custom DecompressViaStream function, but&nbsp;it might just be me misunderstanding what ZlibStream is supposed to do...</p>\r\n<p>Mike</p>\r\n<p>&nbsp;</p>\r\n<div style=\"color:Black;background-color:White\">\r\n<pre><span style=\"color:Blue\">Module</span> ZlibStreamTest\r\n\r\n<span style=\"color:Blue\">#Region</span> <span style=\"color:#A31515\">&quot; Test Methods &quot;</span>\r\n\r\n    <span style=\"color:Blue\">Public</span> <span style=\"color:Blue\">Sub</span> TestRoundtrips()\r\n        <span style=\"color:Blue\">Dim</span> objOriginal() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>\r\n        <span style=\"color:Blue\">Dim</span> objCompressed() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>\r\n        <span style=\"color:Blue\">Dim</span> objDecompressed() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>\r\n        <span style=\"color:Green\">' get an invalid buffer. (size and chars parameters found empirically for a</span>\r\n        <span style=\"color:Green\">' decent success / fail rate on random buffer generation).</span>\r\n        objOriginal = ZlibStreamTest.GenerateFailBuffer(100000, 232, <span style=\"color:Blue\">False</span>, <span style=\"color:Blue\">True</span>)\r\n        <span style=\"color:Green\">' compress by stream, decompress by stream</span>\r\n        objCompressed = ZlibStreamTest.CompressViaStream(objOriginal)\r\n        objDecompressed = ZlibStreamTest.DecompressViaStream(objCompressed)\r\n        <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> ZlibStreamTest.CompareArrays(objDecompressed, objOriginal) <span style=\"color:Blue\">Then</span>\r\n            <span style=\"color:Blue\">Throw</span> <span style=\"color:Blue\">New</span> System.InvalidOperationException\r\n        <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">If</span>\r\n        <span style=\"color:Green\">' compress by stream, decompress by array</span>\r\n        objCompressed = ZlibStreamTest.CompressViaStream(objOriginal)\r\n        objDecompressed = ZlibStreamTest.DecompressViaArray(objCompressed)\r\n        <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> ZlibStreamTest.CompareArrays(objDecompressed, objOriginal) <span style=\"color:Blue\">Then</span>\r\n            <span style=\"color:Blue\">Throw</span> <span style=\"color:Blue\">New</span> System.InvalidOperationException\r\n        <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">If</span>\r\n        <span style=\"color:Green\">' compress by array, decompress by stream</span>\r\n        objCompressed = ZlibStreamTest.CompressViaArray(objOriginal)\r\n        objDecompressed = ZlibStreamTest.DecompressViaStream(objCompressed)\r\n        <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> ZlibStreamTest.CompareArrays(objDecompressed, objOriginal) <span style=\"color:Blue\">Then</span>\r\n            <span style=\"color:Blue\">Throw</span> <span style=\"color:Blue\">New</span> System.InvalidOperationException\r\n        <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">If</span>\r\n        <span style=\"color:Green\">' compress by array, decompress by array</span>\r\n        objCompressed = ZlibStreamTest.CompressViaArray(objOriginal)\r\n        objDecompressed = ZlibStreamTest.DecompressViaArray(objCompressed)\r\n        <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> ZlibStreamTest.CompareArrays(objDecompressed, objOriginal) <span style=\"color:Blue\">Then</span>\r\n            <span style=\"color:Blue\">Throw</span> <span style=\"color:Blue\">New</span> System.InvalidOperationException\r\n        <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">If</span>\r\n    <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Sub</span>\r\n\r\n<span style=\"color:Blue\">#End Region</span>\r\n\r\n<span style=\"color:Blue\">#Region</span> <span style=\"color:#A31515\">&quot; Buffer Generation Methods &quot;</span>\r\n\r\n    <span style=\"color:Blue\">Public</span> <span style=\"color:Blue\">Function</span> GenerateRandomBuffer(<span style=\"color:Blue\">ByVal</span> size <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Integer</span>, <span style=\"color:Blue\">ByVal</span> chars <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Integer</span>) <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>()\r\n        <span style=\"color:Blue\">Dim</span> objRng <span style=\"color:Blue\">As</span> Random\r\n        <span style=\"color:Blue\">Dim</span> objBuffer() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>\r\n        <span style=\"color:Blue\">Dim</span> strValidChars <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">String</span>\r\n        <span style=\"color:Green\">' initialise some working variables</span>\r\n        objRng = <span style=\"color:Blue\">New</span> Random\r\n        <span style=\"color:Blue\">ReDim</span> objBuffer(size - 1)\r\n        <span style=\"color:Green\">' buld the list of characters we'll allow in the random buffer</span>\r\n        strValidChars = <span style=\"color:Blue\">String</span>.Empty\r\n        <span style=\"color:Blue\">For</span> intIndex <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Integer</span> = 0 <span style=\"color:Blue\">To</span> 255\r\n            <span style=\"color:Blue\">If</span> (intIndex &lt; chars) <span style=\"color:Blue\">Then</span>\r\n                strValidChars = strValidChars &amp; ChrW(intIndex)\r\n            <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">If</span>\r\n        <span style=\"color:Blue\">Next</span> intIndex\r\n        <span style=\"color:Green\">' build a random buffer</span>\r\n        <span style=\"color:Blue\">For</span> intByteIndex <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Integer</span> = 0 <span style=\"color:Blue\">To</span> (objBuffer.Length - 1)\r\n            objBuffer(intByteIndex) = Convert.ToByte(objRng.<span style=\"color:Blue\">Next</span>(0, strValidChars.Length - 1))\r\n        <span style=\"color:Blue\">Next</span> intByteIndex\r\n        <span style=\"color:Green\">' return the result</span>\r\n        <span style=\"color:Blue\">Return</span> objBuffer\r\n    <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Function</span>\r\n\r\n    <span style=\"color:Green\">''' &lt;summary&gt;</span>\r\n    <span style=\"color:Green\">''' Generates random buffers until one fails zlib decompression via a base stream.</span>\r\n    <span style=\"color:Green\">''' &lt;/summary&gt;</span>\r\n    <span style=\"color:Green\">''' &lt;param name=&quot;size&quot;&gt;</span>\r\n    <span style=\"color:Green\">''' Number of bytes in the returned buffer.</span>\r\n    <span style=\"color:Green\">''' &lt;/param&gt;</span>\r\n    <span style=\"color:Green\">''' &lt;param name=&quot;chars&quot;&gt;</span>\r\n    <span style=\"color:Green\">''' Number of unique characters to use in the returned buffer. A higher value means </span>\r\n    <span style=\"color:Green\">''' faster matching of a buffer which has the required &quot;fail&quot; properies.</span>\r\n    <span style=\"color:Green\">''' &lt;/param&gt;</span>\r\n    <span style=\"color:Green\">''' &lt;param name=&quot;streamFail&quot;&gt;True if the buffer should fail when using a stream to decompress.&lt;/param&gt;</span>\r\n    <span style=\"color:Green\">''' &lt;param name=&quot;arrayFail&quot;&gt;True if the buffer should fail when using and array to decompress.&lt;/param&gt;</span>\r\n    <span style=\"color:Green\">''' &lt;returns&gt;&lt;/returns&gt;</span>\r\n    <span style=\"color:Green\">''' &lt;remarks&gt;&lt;/remarks&gt;</span>\r\n    <span style=\"color:Blue\">Public</span> <span style=\"color:Blue\">Function</span> GenerateFailBuffer(<span style=\"color:Blue\">ByVal</span> size <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Integer</span>, <span style=\"color:Blue\">ByVal</span> chars <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Integer</span>, <span style=\"color:Blue\">ByVal</span> streamFail <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Boolean</span>, <span style=\"color:Blue\">ByVal</span> arrayFail <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Boolean</span>) <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>()\r\n        <span style=\"color:Blue\">Dim</span> intLoopCount <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Integer</span>\r\n        <span style=\"color:Blue\">Dim</span> objRawBytes() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>\r\n        <span style=\"color:Blue\">Dim</span> objCompressed() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>\r\n        <span style=\"color:Blue\">Dim</span> objDecompressed() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>\r\n        <span style=\"color:Blue\">Dim</span> blnSkipBuffer <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Boolean</span>\r\n        <span style=\"color:Green\">' keep building buffers until we find one we want to keep</span>\r\n        <span style=\"color:Blue\">While</span> <span style=\"color:Blue\">True</span>\r\n            Debug.WriteLine(<span style=\"color:#A31515\">&quot;running iteration &quot;</span> &amp; intLoopCount)\r\n            intLoopCount = intLoopCount + 1\r\n            <span style=\"color:Green\">' build a random buffer</span>\r\n            objRawBytes = ZlibStreamTest.GenerateRandomBuffer(size, chars)\r\n            objCompressed = ZlibStreamTest.CompressViaStream(objRawBytes)\r\n            blnSkipBuffer = <span style=\"color:Blue\">False</span>\r\n            <span style=\"color:Green\">' read the whole compressed file into a byte array, then decompress it</span>\r\n            <span style=\"color:Blue\">Try</span>\r\n                objDecompressed = ZlibStreamTest.DecompressViaStream(objCompressed)\r\n                <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> ZlibStreamTest.CompareArrays(objRawBytes, objDecompressed) <span style=\"color:Blue\">Then</span>\r\n                    <span style=\"color:Blue\">Throw</span> <span style=\"color:Blue\">New</span> System.InvalidOperationException\r\n                <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">If</span>\r\n                <span style=\"color:Blue\">If</span> streamFail <span style=\"color:Blue\">Then</span> blnSkipBuffer = <span style=\"color:Blue\">True</span>\r\n            <span style=\"color:Blue\">Catch</span> ex <span style=\"color:Blue\">As</span> Ionic.Zlib.ZlibException\r\n                <span style=\"color:Green\">' ignore this error - we're looking for a file which we can read in</span>\r\n                <span style=\"color:Green\">' wholesale, but that fails streaming</span>\r\n                Debug.WriteLine(<span style=\"color:#A31515\">&quot;failed reading whole file&quot;</span>)\r\n                <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> streamFail <span style=\"color:Blue\">Then</span> blnSkipBuffer = <span style=\"color:Blue\">True</span>\r\n            <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Try</span>\r\n            <span style=\"color:Green\">' read the compressed file on the fly</span>\r\n            <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> blnSkipBuffer <span style=\"color:Blue\">Then</span>\r\n                <span style=\"color:Blue\">Try</span>\r\n                    objDecompressed = ZlibStreamTest.DecompressViaArray(objCompressed)\r\n                    <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> ZlibStreamTest.CompareArrays(objRawBytes, objDecompressed) <span style=\"color:Blue\">Then</span>\r\n                        <span style=\"color:Blue\">Throw</span> <span style=\"color:Blue\">New</span> System.InvalidOperationException\r\n                    <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">If</span>\r\n                    <span style=\"color:Blue\">If</span> arrayFail <span style=\"color:Blue\">Then</span> blnSkipBuffer = <span style=\"color:Blue\">True</span>\r\n                <span style=\"color:Blue\">Catch</span> ex <span style=\"color:Blue\">As</span> Ionic.Zlib.ZlibException\r\n                    Debug.WriteLine(<span style=\"color:#A31515\">&quot;failed reading captive stream&quot;</span>)\r\n                    <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> arrayFail <span style=\"color:Blue\">Then</span> blnSkipBuffer = <span style=\"color:Blue\">True</span>\r\n                <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Try</span>\r\n            <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">If</span>\r\n            <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> blnSkipBuffer <span style=\"color:Blue\">Then</span>\r\n                <span style=\"color:Blue\">Return</span> objRawBytes\r\n            <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">If</span>\r\n        <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">While</span>\r\n        <span style=\"color:Blue\">Throw</span> <span style=\"color:Blue\">New</span> System.InvalidOperationException\r\n    <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Function</span>\r\n\r\n<span style=\"color:Blue\">#End Region</span>\r\n\r\n<span style=\"color:Blue\">#Region</span> <span style=\"color:#A31515\">&quot; Compression Methods &quot;</span>\r\n\r\n    <span style=\"color:Blue\">Public</span> <span style=\"color:Blue\">Function</span> CompressViaArray(<span style=\"color:Blue\">ByVal</span> data() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>) <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>()\r\n        <span style=\"color:Blue\">Dim</span> objFileBytes() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>\r\n        <span style=\"color:Green\">' decompress the file bytes</span>\r\n        objFileBytes = Ionic.Zlib.ZlibStream.CompressBuffer(data)\r\n        <span style=\"color:Green\">' return the result</span>\r\n        <span style=\"color:Blue\">Return</span> objFileBytes\r\n    <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Function</span>\r\n\r\n    <span style=\"color:Blue\">Public</span> <span style=\"color:Blue\">Function</span> CompressViaStream(<span style=\"color:Blue\">ByVal</span> data() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>) <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>()\r\n        <span style=\"color:Blue\">Dim</span> objFileBytes() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>\r\n        <span style=\"color:Blue\">Dim</span> intBytesRead <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Integer</span>\r\n        <span style=\"color:Green\">' compress the raw data via a memory stream</span>\r\n        <span style=\"color:Blue\">Using</span> objCompressed <span style=\"color:Blue\">As</span> System.IO.MemoryStream = <span style=\"color:Blue\">New</span> System.IO.MemoryStream\r\n            <span style=\"color:Green\">' write the compressed data to the stream</span>\r\n            <span style=\"color:Blue\">Using</span> objZlibOutput <span style=\"color:Blue\">As</span> Ionic.Zlib.ZlibStream = <span style=\"color:Blue\">New</span> Ionic.Zlib.ZlibStream(objCompressed, Ionic.Zlib.CompressionMode.Compress, <span style=\"color:Blue\">True</span>)\r\n                objZlibOutput.Write(data, 0, data.Length)\r\n            <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Using</span>\r\n            <span style=\"color:Green\">' reset the stream</span>\r\n            objCompressed.Flush()\r\n            objCompressed.Seek(0, IO.SeekOrigin.Begin)\r\n            <span style=\"color:Green\">' read the compressed data</span>\r\n            <span style=\"color:Blue\">ReDim</span> objFileBytes(Convert.ToInt32(objCompressed.Length) - 1)\r\n            intBytesRead = objCompressed.Read(objFileBytes, 0, objFileBytes.Length)\r\n            <span style=\"color:Green\">' check we read the full length of the data</span>\r\n            <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> (intBytesRead = objCompressed.Length) <span style=\"color:Blue\">Then</span>\r\n                <span style=\"color:Blue\">Throw</span> <span style=\"color:Blue\">New</span> System.InvalidOperationException\r\n            <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">If</span>\r\n        <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Using</span>\r\n        <span style=\"color:Green\">' return the result</span>\r\n        <span style=\"color:Blue\">Return</span> objFileBytes\r\n    <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Function</span>\r\n\r\n    <span style=\"color:Blue\">Public</span> <span style=\"color:Blue\">Function</span> DecompressViaArray(<span style=\"color:Blue\">ByVal</span> data() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>) <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>()\r\n        <span style=\"color:Blue\">Dim</span> objFileBytes() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>\r\n        <span style=\"color:Green\">' decompress the file bytes</span>\r\n        objFileBytes = Ionic.Zlib.ZlibStream.UncompressBuffer(data)\r\n        <span style=\"color:Green\">' return the result</span>\r\n        <span style=\"color:Blue\">Return</span> objFileBytes\r\n    <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Function</span>\r\n\r\n    <span style=\"color:Blue\">Public</span> <span style=\"color:Blue\">Function</span> DecompressViaStream(<span style=\"color:Blue\">ByVal</span> data() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>) <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>()\r\n        <span style=\"color:Blue\">Dim</span> objFileBytes() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>\r\n        <span style=\"color:Blue\">Dim</span> intBytesRead <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Integer</span>\r\n        <span style=\"color:Green\">' decompress the data via a memory stream</span>\r\n        <span style=\"color:Blue\">Using</span> objCompressed <span style=\"color:Blue\">As</span> System.IO.MemoryStream = <span style=\"color:Blue\">New</span> System.IO.MemoryStream\r\n            <span style=\"color:Green\">' write the compressed data to the stream</span>\r\n            <span style=\"color:Blue\">Using</span> objZlibOutput <span style=\"color:Blue\">As</span> Ionic.Zlib.ZlibStream = <span style=\"color:Blue\">New</span> Ionic.Zlib.ZlibStream(objCompressed, Ionic.Zlib.CompressionMode.Decompress, <span style=\"color:Blue\">True</span>)\r\n                objZlibOutput.Write(data, 0, data.Length)\r\n            <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Using</span>\r\n            <span style=\"color:Green\">' reset the stream</span>\r\n            objCompressed.Flush()\r\n            objCompressed.Seek(0, IO.SeekOrigin.Begin)\r\n            <span style=\"color:Green\">' read the decompressed data</span>\r\n            <span style=\"color:Blue\">ReDim</span> objFileBytes(Convert.ToInt32(objCompressed.Length) - 1)\r\n            intBytesRead = objCompressed.Read(objFileBytes, 0, objFileBytes.Length)\r\n            <span style=\"color:Green\">' check we read the full length of the data</span>\r\n            <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> (intBytesRead = objCompressed.Length) <span style=\"color:Blue\">Then</span>\r\n                <span style=\"color:Blue\">Throw</span> <span style=\"color:Blue\">New</span> System.InvalidOperationException\r\n            <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">If</span>\r\n        <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Using</span>\r\n        <span style=\"color:Green\">' return the result</span>\r\n        <span style=\"color:Blue\">Return</span> objFileBytes\r\n    <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Function</span>\r\n\r\n<span style=\"color:Blue\">#End Region</span>\r\n\r\n<span style=\"color:Blue\">#Region</span> <span style=\"color:#A31515\">&quot; Comparison Methods &quot;</span>\r\n\r\n    <span style=\"color:Blue\">Public</span> <span style=\"color:Blue\">Function</span> CompareArrays(<span style=\"color:Blue\">ByVal</span> obj1() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>, <span style=\"color:Blue\">ByVal</span> obj2() <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Byte</span>) <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Boolean</span>\r\n        <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> (obj1.Length = obj2.Length) <span style=\"color:Blue\">Then</span> <span style=\"color:Blue\">Return</span> <span style=\"color:Blue\">False</span>\r\n        <span style=\"color:Blue\">For</span> intIndex <span style=\"color:Blue\">As</span> <span style=\"color:Blue\">Integer</span> = 0 <span style=\"color:Blue\">To</span> (obj1.Length - 1)\r\n            <span style=\"color:Blue\">If</span> <span style=\"color:Blue\">Not</span> (obj1(intIndex) = obj2(intIndex)) <span style=\"color:Blue\">Then</span> <span style=\"color:Blue\">Return</span> <span style=\"color:Blue\">False</span>\r\n        <span style=\"color:Blue\">Next</span> intIndex\r\n        <span style=\"color:Blue\">Return</span> <span style=\"color:Blue\">True</span>\r\n    <span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Function</span>\r\n\r\n<span style=\"color:Blue\">#End Region</span>\r\n\r\n<span style=\"color:Blue\">End</span> <span style=\"color:Blue\">Module</span></pre>\r\n</div>",
    "PostedDate": "2010-03-29T18:13:13.773-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "425560",
    "ThreadId": "207718",
    "Html": "<p>I understand you believe that ZlibStream is not decompressing, what it has already compressed.</p>\r\n<p>Show me a simpler example, something with fewer lines of code.&nbsp; You said you distilled it, but there's an awful lot of code there.</p>\r\n<p>For &quot;round trip&quot; problems with string data it should be as simple as this:</p>\r\n<div style=\"border:solid .1em #ccc;color:Black;background-color:White;margin:.25em 0.5em 0 0.5em;padding:0.25em .25em 0.25em .25em\">\r\n<pre>String data = <span style=\"color:#A31515\">@&quot;The good will is not good because of what it effects \r\nor accomplishes or because of its competence to achieve some intended \r\nend: it is good only because of its willing (i.e. it is good in itself).\r\n\r\nEven if it should happen that, by a particularly unfortunate fate or by\r\nthe niggardly provision of a step-motherly nature, this will should be\r\nwholly lacking in power to accomplish its purpose, and if even the\r\ngreatest effort should not avail it to achieve anything of its end, and\r\nif there remained only the good will not as a mere wish, but as the\r\nsummoning of all the means in our power - it will sparkle like a jewel\r\nall by itself, as something that had its full worth in itself.&quot;</span>;\r\n\r\nSystem.Console.WriteLine(<span style=\"color:#A31515\">&quot;original:&quot;</span>);\r\nSystem.Console.WriteLine(data);\r\n<span style=\"color:Blue\">var</span> c = ZlibStream.CompressString(data);\r\n<span style=\"color:Blue\">string</span> uncompressed = ZlibStream.UncompressString(c);\r\nSystem.Console.WriteLine(<span style=\"color:#A31515\">&quot;uncompressed:&quot;</span>);\r\nSystem.Console.WriteLine(uncompressed);\r\nSystem.Console.WriteLine(<span style=\"color:#A31515\">&quot;are equal?: {0}&quot;</span>, data.Equals( uncompressed));</pre>\r\n</div>\r\n<p>Right? and for byte array data, like this:</p>\r\n<div style=\"border:solid .1em #ccc;color:Black;background-color:White;margin:.25em 0.5em 0 0.5em;padding:0.25em .25em 0.25em .25em\">\r\n<pre><span style=\"color:Blue\">byte</span>[]  bdata = {\r\n0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\r\n0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,\r\n0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,\r\n0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\r\n0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,\r\n0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,\r\n0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\r\n0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\r\n0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f\r\n};\r\n\r\nFunc&lt;<span style=\"color:Blue\">byte</span>[],<span style=\"color:Blue\">byte</span>[],<span style=\"color:Blue\">bool</span>&gt; check = (a,b) =&gt; {\r\n    <span style=\"color:Blue\">if</span> (a.Length != b.Length) <span style=\"color:Blue\">return</span> <span style=\"color:Blue\">false</span>;\r\n    <span style=\"color:Blue\">for</span> (<span style=\"color:Blue\">int</span> i=0; i &lt; a.Length;  i++)\r\n    {\r\n        <span style=\"color:Blue\">if</span> (a[i]!=b[i]) <span style=\"color:Blue\">return</span> <span style=\"color:Blue\">false</span>;\r\n    }\r\n    <span style=\"color:Blue\">return</span> <span style=\"color:Blue\">true</span>;};\r\n\r\n<span style=\"color:Blue\">byte</span>[] c = ZlibStream.CompressBuffer(bdata);\r\n<span style=\"color:Blue\">byte</span>[] buncompressed = ZlibStream.UncompressBuffer(c);\r\nSystem.Console.WriteLine(<span style=\"color:#A31515\">&quot;are equal?: {0}&quot;</span>, check(bdata, buncompressed));</pre>\r\n</div>\r\n<p>I just ran both of those snippets and the roundtrip checks out. So I'm not clear on the problem.</p>\r\n<p>You said something about random buffers and streams, but that seems like a different thing. Make it really clear and simple for me and I will look into it.&nbsp; Minimal code to illustrate the problem.</p>",
    "PostedDate": "2010-03-30T09:25:47.523-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "426029",
    "ThreadId": "207718",
    "Html": "<p>Sorry about the length - I was trying to be as complete as possible.&nbsp;Basically, some data doesn't roundtrip properly if you compress then decompress using ZlibStream&nbsp;- you get an exception when you try to decompress.</p>\r\n<p>The smallest buffer I could&nbsp;find that shows this problem is about 50k and ran to about 3000+ lines when I formatted it like your second example. I've created a post in the Issue Tracker instead so I can attach the buffer as a file - see <a href=\"http://dotnetzip.codeplex.com/WorkItem/View.aspx?WorkItemId=10562\">http://dotnetzip.codeplex.com/WorkItem/View.aspx?WorkItemId=10562</a>.</p>\r\n<p>M</p>",
    "PostedDate": "2010-03-31T07:49:27.687-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "426081",
    "ThreadId": "207718",
    "Html": "<p>Great, I'll have a look.</p>\r\n<p>&nbsp;</p>",
    "PostedDate": "2010-03-31T09:19:52.883-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  },
  {
    "Id": "426101",
    "ThreadId": "207718",
    "Html": "<p>Mike, Thanks for the report. I reproduced the problem here.&nbsp; WIll let you know what I find.</p>",
    "PostedDate": "2010-03-31T10:24:51.723-07:00",
    "UserRole": null,
    "MarkedAsAnswerDate": null
  }
]