Дефлируйте и надувайте для PDF, используя zlib Stack Overflow

Я пытаюсь реализовать функции «zlib.h» deflate и inflate для сжатия и распаковки потоков в PDF-файл.
Вход: сжатый поток из PDF-файла. Я реализовал функцию inflate — все в порядке, у меня есть несжатый поток, после чего я пытаюсь снова сжать этот поток с помощью функции deflate, поскольку на выходе у меня есть сжатый поток, но он не равен входному сжатому потоку, и они не равны длина. Что я делаю не так? Это часть моего кода:

     size_t outsize = (streamend - streamstart) * 10;
char* output = new char[outsize]; ZeroMemory(output, outsize);

z_stream zstrm; ZeroMemory(&zstrm, sizeof(zstrm));
zstrm.avail_in = streamend - streamstart + 1;
zstrm.avail_out = outsize;
zstrm.next_in = (Bytef*)(buffer + streamstart);//block of date to infalte
zstrm.next_out = (Bytef*)output;

int rsti = inflateInit(&zstrm);
if (rsti == Z_OK)
{
int rst2 = inflate(&zstrm, Z_FINISH);
if (rst2 >= 0)
{
cout << output << endl;//inflated data
}
}

char* deflate_output = new char[streamend - streamstart];
ZeroMemory(deflate_output, streamend - streamstart);
z_stream d_zstrm; ZeroMemory(&d_zstrm, sizeof(d_zstrm));

d_zstrm.avail_in = (uInt) (strlen(output)+1);
d_zstrm.avail_out = (uInt) (streamend - streamstart);
d_zstrm.next_in = (Bytef*)(output);
d_zstrm.next_out = (Bytef*)(deflate_output);
int rsti1 = deflateInit(&d_zstrm, Z_DEFAULT_COMPRESSION);

if (rsti1 == Z_OK)
{
int rst22 = deflate(&d_zstrm, Z_FINISH);
out << deflate_output << endl << "**********************" << endl;
//I try to write deflated stream to file
printf("New size of stream: %lu\n", (char*)d_zstrm.next_out - deflate_output);
}

1

Решение

Нет ничего плохого. Для данного несжатого потока не существует уникального сжатого потока. Все, что требуется, — это чтобы декомпрессия вернула вам именно то, что было сжато (следовательно, «без потерь»).

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

Если вы не можете воспроизвести исходные сжатые данные, ну и что? Все, что имеет значение, это то, что вы можете создать действительный PDF-файл, который можно распаковать и который содержит содержимое, которое вы хотите.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector