Ionic.zlib прекращает сжатие, когда сжатый файл достигает 65536 байт? — C#

#c# #zlib

#c# #zlib

Вопрос:

Привет, у меня возникли проблемы со сжатием файлов с помощью Ionic.zlib, я новичок в C #, поэтому проблема может быть легко разрешима. Если я сжимаю большой файл, скажем, размером 500 кб, то, как только сжатый файл достигнет 65536 байт, он остановится, если я затем распаковываю файл, в нем отсутствует много данных : /. Я могу исправить это, установив для буфера значение, равное 4 000 000, но я слышал, что лучше всего установить для него значение 0x4000.

         ZlibStream compressor = new ZlibStream(gsc_stream, CompressionMode.Compress, CompressionLevel.BestCompression, true);
        byte[] buffer = new byte[0x4000];
        Int32 n;

        int previous = Convert.ToInt32(zone.Position);

        while ((n = compressor.Read(buffer, 0, buffer.Length)) != 0)
        {
            zone.Write(buffer, 0, n);

        }
        zone.Flush();
        compressor.Flush();
  

Ответ №1:

Похоже, у вас все наоборот.
Если вы пытаетесь сжать файл в потоке gsc_stream и записать результат в поток zone , тогда правильный код будет:

 using (ZlibStream compressor = new ZlibStream(zone, CompressionMode.Compress, CompressionLevel.BestCompression, true))
{
    byte[] buffer = new byte[0x4000];
    int n;
    while ((n = gsc_stream.Read(buffer, 0, buffer.Length)) != 0)
    {
        compressor.Write(buffer, 0, n);
    }
    zone.Flush();
    compressor.Flush();
}
  

Комментарии:

1. У него даже больше нет заголовка zlib, и он сжимает части файла, которые я ему не указывал. Эй, по крайней мере, он сделал больше, чем 65536 байт.

2. Верхняя часть зоны не сжимается, как только в файл записывается первый gsc_stream, с этого момента сжимается остальная часть файла, за исключением начала, с которого это было сделано, до того, как зона положения была четной, и, как я уже сказал, заголовка zlib вообще нет.

3. @Levi gsc_stream должно быть что-то вроде: gsc_stream = System.IO.File.OpenRead(fileToCompress);

4. Это предназначено для открытия gsc_stream и записи его сжатой версии в зону, вот вся моя функция для записи файлов gsc в зону. Добавил это в первый пост.

5. Я сделал то, что вы сказали, и установил для flushmode значение partial, но теперь он сжимает только 75 кб байт :/.