Проблема сжатия и распаковки с zlib.Net - PullRequest
2 голосов
/ 08 июля 2011

Я использую ZLIB.Net , и я просто не понимаю, что мне делать, чтобы сжать поток, который не FileStream, а MemoryStream.Делая:

byte[] buffer = ASCIIEncoding.ASCII.GetBytes("Hello World");

MemoryStream outStream = new MemoryStream();
zlib.ZOutputStream outZStream = new zlib.ZOutputStream(
    outStream,
    zlib.zlibConst.Z_BEST_COMPRESSION);

outZStream.Write(buffer, 0, buffer.Length);
outZStream.finish();

buffer = outStream.GetBuffer();
Debug.WriteLine(DateTime.Now.ToString() + ":" + buffer.Length);

MemoryStream inStream = new MemoryStream(buffer);
MemoryStream mo = new MemoryStream();
zlib.ZInputStream inZStream = new zlib.ZInputStream(
    inStream,
    zlib.zlibConst.Z_BEST_COMPRESSION);

int n = 0;
while ((n = inZStream.Read(buffer, 0, buffer.Length)) > 0)
{
    mo.Write(buffer, 0, n);
}

string STR = ASCIIEncoding.ASCII.GetString(mo.GetBuffer());

Я не могу вернуть строку "Hello World".

1 Ответ

9 голосов
/ 08 июля 2011

longbkit , Спасибо за эту ссылку.Там есть код:

 public static void CompressData(byte[] inData, out byte[] outData)
{
    using (MemoryStream outMemoryStream = new MemoryStream())
    using (ZOutputStream outZStream = new ZOutputStream(outMemoryStream, zlibConst.Z_DEFAULT_COMPRESSION))
    using (Stream inMemoryStream = new MemoryStream(inData))
    {
        CopyStream(inMemoryStream, outZStream);
        outZStream.finish();
        outData = outMemoryStream.ToArray();
    }
}

public static void DecompressData(byte[] inData, out byte[] outData)
{
    using (MemoryStream outMemoryStream = new MemoryStream())
    using (ZOutputStream outZStream = new ZOutputStream(outMemoryStream))
    using (Stream inMemoryStream = new MemoryStream(inData))
    {
        CopyStream(inMemoryStream, outZStream);
        outZStream.finish();
        outData = outMemoryStream.ToArray();
    }
}

public static void CopyStream(System.IO.Stream input, System.IO.Stream output)
{
    byte[] buffer = new byte[2000];
    int len;
    while ((len = input.Read(buffer, 0, 2000)) > 0)
    {
        output.Write(buffer, 0, len);
    }
    output.Flush();
}   

Работает.Но то, что я вижу, это единственное различие между Сжатие и Декомпрессия - это Тип сжатия в конструкторе ZOutput ...

Удивительно.Для меня было бы более понятно, если бы Compression назывался Output, а Decompression - Input.или такой ... на самом деле это только Вывод.

❋ пользователь "Джон Смит" сломал оригинальный код, поскольку CopyTo не работает и вызывает исключение в его отредактированном тексте (и дважды одобрен другими)Возврат к исходному коду с помощью OP.Пожалуйста, проверьте отредактированный код в следующий раз перед редактированием, спасибо.

...