zlib deflate и динамический выходной буфер

0

Хорошо, я немного переделал свой вопрос, я не понимаю, как правильно дефлировать содержимое в буфер DYNAMIC, который должен постоянно перераспределяться. Я немного переписал свой код, и он работает ТОЛЬКО, если перераспределение буфера не происходит, поэтому на небольшом количестве данных перераспределение прерывает каким-то образом выходной поток.

void test_deflate_dynamic(char*str)
{

if(store == NULL)  // first call to the function allocate some memory etc
    {   

        gzip_stream.zalloc = Z_NULL;
        gzip_stream.zfree = Z_NULL;
        gzip_stream.opaque = Z_NULL;

        result =  deflateInit(&gzip_stream,9);
        if(result!=Z_OK) { printf("bad\r\n"); exit(0); }


        total_buf_size =deflateBound(&gzip_stream,strlen(str));
        printf("d_bound_init=%d\r\n",total_buf_size);

        store = realloc(store,total_buf_size); // first allocation
        gzip_stream.avail_out = total_buf_size;

        gzip_stream.next_out = store;

        gzip_stream.avail_in = strlen(str)+1;
        gzip_stream.next_in = str;

        result = deflate(&gzip_stream,Z_NO_FLUSH);

    }

    else
    {

       gzip_stream.avail_in = strlen(str)+1;
       gzip_stream.next_in = str;
       int t_size;


        printf ("avail_out=%d\r\n",gzip_stream.avail_out);

        t_size = deflateBound(&gzip_stream,strlen(str));
        printf("d_bound=%d\r\n",t_size);
        total_buf_size += t_size;
        gzip_stream.avail_out = total_buf_size;
        store = realloc(store,total_buf_size);

        gzip_stream.next_out = store;

        result = deflate(&gzip_stream,Z_NO_FLUSH);


    }
}

Как вы можете видеть, я использую функцию deflateBound для определения того, сколько данных мне нужно выделить, так что во-первых, правильно ли использовать deflateBound? Во-вторых, указатель, который был изменен realloc а затем повторно назначен на z_stream, все еще указывает на начало данных? Поэтому в основном, если я использую несколько перераспределений, конечные данные нарушаются. Конец: как правильно определить, сколько данных мне нужно выделить для моего выходного дефлятного буфера, и правильно ли использовать динамический перераспределяющий буфер в z_stream?

  • 0
    То, что вы делаете правильно или неправильно, также зависит от того, как вы вызываете test_deflate_dynamic() и что вы делаете с данными, которые он выдает. Поэтому вы должны опубликовать полную программу.
Теги:
gzip
zlib
deflate

1 ответ

0

realloc гарантирует, что данные будут скопированы в новое место, когда новый размер не поместится в старую ячейку памяти. calloc просто нули выделенной памяти и не копирует старые данные. Поэтому вы должны передавать большие значения calloc. Вероятно, вам нужен только один вызов calloc когда вы передаете ему большие числа, тогда как realloc может принимать меньшие приращения. Имеют смысл?

ура

  • 0
    Поэтому я предполагаю, что я не могу использовать realloc с z_stream, так как буфер должен быть установлен только один раз, поэтому deflate сделает из этого буфера правильное сжатое содержимое, я не могу перераспределить его, верно? Это должно быть предварительно выделено?
  • 0
    Посмотрите мой вопрос еще раз, пожалуйста, я сделал много правок.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню