public void Zlib_BasicDictionaryDeflateInflate() { int rc; int comprLen = 40000; int uncomprLen = comprLen; byte[] uncompr = new byte[uncomprLen]; byte[] compr = new byte[comprLen]; //long dictId; ZlibCodec compressor = new ZlibCodec(); rc = compressor.InitializeDeflate(CompressionLevel.BestCompression); Assert.AreEqual<int>(ZlibConstants.Z_OK, rc, String.Format("at InitializeDeflate() [{0}]", compressor.Message)); string dictionaryWord = "hello "; byte[] dictionary = System.Text.ASCIIEncoding.ASCII.GetBytes(dictionaryWord); string TextToCompress = "hello, hello! How are you, Joe? I said hello. "; byte[] BytesToCompress = System.Text.ASCIIEncoding.ASCII.GetBytes(TextToCompress); rc = compressor.SetDictionary(dictionary); Assert.AreEqual<int>(ZlibConstants.Z_OK, rc, String.Format("at SetDeflateDictionary() [{0}]", compressor.Message)); int dictId = compressor.Adler32; compressor.OutputBuffer = compr; compressor.NextOut = 0; compressor.AvailableBytesOut = comprLen; compressor.InputBuffer = BytesToCompress; compressor.NextIn = 0; compressor.AvailableBytesIn = BytesToCompress.Length; rc = compressor.Deflate(FlushType.Finish); Assert.AreEqual<int>(ZlibConstants.Z_STREAM_END, rc, String.Format("at Deflate() [{0}]", compressor.Message)); rc = compressor.EndDeflate(); Assert.AreEqual<int>(ZlibConstants.Z_OK, rc, String.Format("at EndDeflate() [{0}]", compressor.Message)); ZlibCodec decompressor = new ZlibCodec(); decompressor.InputBuffer = compr; decompressor.NextIn = 0; decompressor.AvailableBytesIn = comprLen; rc = decompressor.InitializeInflate(); Assert.AreEqual<int>(ZlibConstants.Z_OK, rc, String.Format("at InitializeInflate() [{0}]", decompressor.Message)); decompressor.OutputBuffer = uncompr; decompressor.NextOut = 0; decompressor.AvailableBytesOut = uncomprLen; while (true) { rc = decompressor.Inflate(FlushType.None); if (rc == ZlibConstants.Z_STREAM_END) { break; } if (rc == ZlibConstants.Z_NEED_DICT) { Assert.AreEqual<long>(dictId, decompressor.Adler32, "Unexpected Dictionary"); rc = decompressor.SetDictionary(dictionary); } Assert.AreEqual<int>(ZlibConstants.Z_OK, rc, String.Format("at Inflate/SetInflateDictionary() [{0}]", decompressor.Message)); } rc = decompressor.EndInflate(); Assert.AreEqual<int>(ZlibConstants.Z_OK, rc, String.Format("at EndInflate() [{0}]", decompressor.Message)); int j = 0; for (; j < uncompr.Length; j++) if (uncompr[j] == 0) break; Assert.AreEqual<int>(TextToCompress.Length, j, String.Format("Unequal lengths")); int i = 0; for (i = 0; i < j; i++) if (TextToCompress[i] != uncompr[i]) break; Assert.AreEqual<int>(j, i, String.Format("Non-identical content")); var result = System.Text.ASCIIEncoding.ASCII.GetString(uncompr, 0, j); TestContext.WriteLine("orig length: {0}", TextToCompress.Length); TestContext.WriteLine("compressed length: {0}", compressor.TotalBytesOut); TestContext.WriteLine("uncompressed length: {0}", decompressor.TotalBytesOut); TestContext.WriteLine("result length: {0}", result.Length); TestContext.WriteLine("result of inflate:\n{0}", result); }