zlib deflate和动态输出缓冲区

时间:2014-07-01 13:13:05

标签: c++ c gzip zlib deflate

好的,我重新提出了我的问题,我不明白如何正确地将内容放入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的指针仍然指向数据的开头?所以基本上如果我使用多次重新分配,最终数据就会被破坏。结束:我如何正确检测,我需要为输出deflate缓冲区分配多少数据,在z_stream中使用动态重新分配缓冲区是否正确?

1 个答案:

答案 0 :(得分:0)

realloc可确保在新尺寸不适合旧内存位置时将数据复制到新位置。 calloc只是将分配的内存归零,并且不会复制旧数据。因此,您必须将更大的值传递给calloc。当您传递大数字时,您可能只需要一次调用calloc,而realloc可以接受较小的增量。有意义吗?

干杯