2017-01-12 2 views
1

Я пытаюсь сжать и распаковать простейший способ случайной сгенерированной строки с zlib, используя функции и uncompress(). Но после выполнения функции uncompress() я получаю Z_DATA_ERROR (-3). Кто-нибудь знает, где моя ошибка?zlib сжимать и распаковывать использование

Вот код:

int 
main(int argc __attribute ((unused)),char **argv __attribute ((unused))) 
{ 
    unsigned char* cara_in; 
    unsigned char* cara_inter; 
    unsigned char* cara_out; 

    size_t i; 
    size_t len = 1024*50; //50 KBytes 
    int ret; 

    cara_in = (unsigned char*)malloc(sizeof(unsigned char*)*len); 
    cara_inter = (unsigned char*)malloc(sizeof(unsigned char*)*len); 
    cara_out = (unsigned char*)malloc(sizeof(unsigned char*)*len); 

    uLongf size_cara_inter; 
    uLongf size_cara_out; 

    srand(time (NULL)); 

    /* Generating */ 
    for(i=0; i < len-1;i++) 
    { 
     cara_in[i] = (int)(rand() %24 +65); 
    } 

    size_cara_inter = 2*len; 

    ret = compress(
       cara_inter, 
       &size_cara_inter, 
       cara_in, 
       (uLongf)strlen((const char*)cara_in) 
       ); 
    if(ret != Z_OK) 
    { 
     /* error */ 
     return EXIT_FAILURE; 
    } 

    size_cara_out = 2*len; 

    ret = uncompress(
       cara_out, 
       &size_cara_out, 
       cara_inter, 
       (uLongf)strlen((const char*)cara_inter) 
       ); 
    if(ret != Z_OK) 
    { 
     /* error */ 
     return EXIT_FAILURE; 
    } 

    /* compare */ 
    ret = strcmp((const char*)cara_in, (const char*)cara_out); 
    if(ret != 0){ 
     /*problem*/ 
     fprintf(stderr, "\nOuups! :(\nResult of cmp is %d", ret); 
     fflush(stderr); 

     fprintf(
        stderr, 
        "\ncara_in length : %d, cara_out length : %d\n", 
        (unsigned)strlen((const char*)cara_in), (unsigned)strlen((const char*)cara_out) 
        ); 
     fflush(stderr); 
    } 

    return EXIT_SUCCESS; 
} 
+1

Является ли ваш компилятор почему-то не говорит вам о несовпадении типа аргументов в вашем файле 'компресса() 'и' распаковать() 'вызовы? В этом случае установите уровни предупреждений. Если он * говорит вам, то разве вы не думаете, что предупреждения компиляции могут быть связаны с отказом во время выполнения? –

+0

Уупс, да! Я исправил предупреждения, но он все еще не работает ... – gl393

+0

Добро пожаловать в Stackoverflow Gaston Lagaffe! Потенциальной причиной отказа является то, что нулевой завершающий символ выделяется, но никогда не устанавливается в 0. Таким образом, 'strlen (cara_in)' является неопределенным поведением. Это называется «gaffe» на французском языке ... – francis

ответ

0

А вот исправленный исходный код, благодаря Фрэнсисам:

int 
main(int argc __attribute ((unused)),char **argv __attribute ((unused))) 
{ 
    unsigned char* cara_in; 
    unsigned char* cara_inter; 
    unsigned char* cara_out; 

    size_t i; 
    size_t len = 1024*50; //50 KBytes 
    int ret; 

    cara_in = (unsigned char*)malloc(sizeof(unsigned char*)*len); 
    cara_inter = (unsigned char*)malloc(sizeof(unsigned char*)*len); 
    cara_out = (unsigned char*)malloc(sizeof(unsigned char*)*len); 

    uLongf size_cara_inter; 
    uLongf size_cara_out; 

    srand(time (NULL)); 

    /* Generating */ 
    for(i=0; i < len-1;i++) 
    { 
     cara_in[i] = (int)(rand() %24 +65); 
    } 

    cara_in[len] = '\0'; 

    size_cara_inter = 2*len; 

    ret = compress(
       cara_inter, 
       &size_cara_inter, 
       cara_in, 
       (uLongf)strlen((const char*)cara_in) 
       ); 
    if(ret != Z_OK) 
    { 
     /* error */ 
     return EXIT_FAILURE; 
    } 

    size_cara_out = 2*len; 

    ret = uncompress(
       cara_out, 
       &size_cara_out, 
       cara_inter, 
       size_cara_inter 
       ); 
    if(ret != Z_OK) 
    { 
     /* error */ 
     return EXIT_FAILURE; 
    } 

    /* compare */ 
    ret = strcmp((const char*)cara_in, (const char*)cara_out); 
    if(ret != 0){ 
     /*problem*/ 
     fprintf(stderr, "\nOuups! :(\nResult of cmp is %d", ret); 
     fflush(stderr); 

     fprintf(
        stderr, 
        "\ncara_in length : %d, cara_out length : %d\n", 
        (unsigned)strlen((const char*)cara_in), (unsigned)strlen((const char*)cara_out) 
        ); 
     fflush(stderr); 
    } 

    return EXIT_SUCCESS; 
}