Сжатие \ распаковка бинарных файлов - PullRequest
0 голосов
/ 23 мая 2018

Мне нужно распаковать файл * .bin в определенный временный файл, выполнить с ним определенные действия в моей программе, а затем сжать его.Есть функция, которая распаковывает файл * .bin.Т.е. получен временный файл для корректной работы программы.Функция:

public void Unzlib_bin(string initial_location, string target_location)
{
    byte[] data, new_data;
    Inflater inflater;

    inflater = new Inflater(false);

    data = File.ReadAllBytes(initial_location);
    inflater.SetInput(data, 16, BitConverter.ToInt32(data, 8));
    new_data = new byte[BitConverter.ToInt32(data, 12)];
    inflater.Inflate(new_data);

    File.WriteAllBytes(target_location, new_data);
}

Вопрос в том, как упаковать временный файл в исходное состояние?Я пытаюсь сделать что-то вроде следующего, но результат неправильный:

public void Zlib_bin(byte[] data, int length, string target_location)
{
    byte[] new_data;
    Deflater deflater;
    List<byte> compress_data;

    compress_data = new List<byte>();
    new_data = new byte[length];
    deflater = new Deflater();

    compress_data.AddRange(new byte[] { ... }); //8 bytes from header, it does not matter
    deflater.SetLevel(Deflater.BEST_COMPRESSION);
    deflater.SetInput(data, 0, data.Length);
    deflater.Finish();
    deflater.Deflate(new_data);
    compress_data.AddRange(BitConverter.GetBytes(new_data.Length));
    compress_data.AddRange(BitConverter.GetBytes(data.Length));
    compress_data.AddRange(new_data);

    File.WriteAllBytes(target_location, compress_data.ToArray());
}

Есть идеи?

1 Ответ

0 голосов
/ 23 мая 2018

Если под «неправильным результатом» вы подразумеваете, что не можете сжать обратно до точно таких же байтов, это вполне ожидаемо.Нет гарантии, что распаковка с последующим сжатием дает вам одно и то же, если только вы не используете точно такой же код сжатия, версию этого кода и настройки для этого кода.

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

Единственная гарантия для компрессора без потерь состоит в том, что при сжатии, а затем распаковке вы получаете именно то, с чего начали.

При распаковкето, что вы получили, дает те же несжатые данные, тогда все хорошо.

...