Как правильно распаковать файл, используя zlib?

Как декомпрессировать файл .binfont, предположительно шрифта из игры, который сжат с использованием zlib? Компрессия, судя по первому изображению, выполнена дважды. Я уже использовал offzip для декомпрессии файла дважды и получил два файла: один размером 5кб и второй финальный размером 128кб. Однако финальный файл не похож на bitmap. Мне нужна помощь, так как я уже потратил на это более суток безрезультатно.
Изображение к вопросу
Изображение к вопросу
  • 11 ноября 2023 г. 16:09
Ответы на вопрос 2
Для распаковки файла, сжатого с использованием zlib, вам понадобится использовать соответствующую библиотеку, такую как zlib.h в языке программирования C/C++.

Вот пример простой программы на языке C, которая демонстрирует распаковку файла с использованием zlib:

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zlib.h>

int main() {
    FILE *inputFile;
    FILE *outputFile;
    unsigned char *compressedData;
    unsigned char *uncompressedData;
    int compressedSize;
    int uncompressedSize;

    // Открываем сжатый файл
    inputFile = fopen("compressed.binfont", "rb");
    if (inputFile == NULL) {
        printf("Не удалось открыть входной файл.\n");
        return 1;
    }

    // Получаем размер сжатых данных
    fseek(inputFile, 0, SEEK_END);
    compressedSize = ftell(inputFile);
    fseek(inputFile, 0, SEEK_SET);

    // Выделяем память под сжатые данные
    compressedData = (unsigned char*)malloc(compressedSize);
    if (compressedData == NULL) {
        printf("Ошибка выделения памяти.\n");
        fclose(inputFile);
        return 1;
    }

    // Читаем данные из файла
    fread(compressedData, 1, compressedSize, inputFile);
    fclose(inputFile);

    // Выделяем память под распакованные данные
    uncompressedData = (unsigned char*)malloc(compressedSize*10); // Предполагаем, что размер распакованных данных может быть в 10 раз больше
    if (uncompressedData == NULL) {
        printf("Ошибка выделения памяти.\n");
        free(compressedData);
        return 1;
    }

    // Распаковываем данные
    uncompressedSize = compressedSize*10; // Передаем размер выделенной памяти
    if (uncompress(uncompressedData, &uncompressedSize, compressedData, compressedSize) != Z_OK) {
        printf("Ошибка при распаковке данных.\n");
        free(compressedData);
        free(uncompressedData);
        return 1;
    }

    // Создаем выходной файл
    outputFile = fopen("uncompressed.binfont", "wb");
    if (outputFile == NULL) {
        printf("Не удалось создать выходной файл.\n");
        free(compressedData);
        free(uncompressedData);
        return 1;
    }

    // Записываем распакованные данные в файл
    fwrite(uncompressedData, 1, uncompressedSize, outputFile);
    fclose(outputFile);

    // Освобождаем память
    free(compressedData);
    free(uncompressedData);

    printf("Файл успешно распакован.\n");

    return 0;
}
```

Пример предполагает, что у вас есть сжатый файл "compressed.binfont" в той же директории, что и исполняемый файл, и после распаковки будет создан файл "uncompressed.binfont".

Эта программа использует функцию uncompress из zlib для распаковки данных. Вы можете настроить пути к файлам и размеры буферов, а также добавить дополнительные проверки и обработки ошибок по своему усмотрению. Однако, учтите, что распакованный файл не обязательно будет bitmap, возможно, вам потребуется применить дополнительные действия для правильного отображения его содержимого.
Скорее всего, первые три байта в формате RAW RGBA представляют собой цвет (черный) и уровень прозрачности. Однако, чтобы точно определить это, нужно иметь более полную информацию о формате и содержимом изображения.
Похожие вопросы