/ / Compresión / descompresión de matrices de caracteres utilizando zlib, faltan algunos caracteres - c, compresión, zlib

Comprimir / descomprimir la matriz char utilizando zlib, faltan algunos caracteres - c, compresión, zlib

He escrito un programa que, supuestamente, deberíacomprime y luego descomprime la cadena usando las funciones zlib compress () y uncompress (), compila muy bien, pero por alguna razón, cuando la comienzo, faltan algunos símbolos de la cadena sin comprimir. Lo que obtengo es "algo" y luego Algunos símbolos del sistema. ¿Podría alguien ayudarme a encontrar el error aquí?

#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "zlib.h"
int main()
{
const char *istream = "some foo";
ulong destLen = strlen(istream);
char* ostream = malloc(2 * strlen(istream));
int res = compress(ostream, &destLen, istream, destLen + 1);


const char *i2stream = ostream;
char* o2stream = malloc(4 * strlen(istream));
ulong destLen2 = strlen(i2stream);
int des = uncompress(o2stream, &destLen2, i2stream, destLen2);
printf("%s", o2stream);
return 0;
}

Respuestas

4 para la respuesta № 1

Revisa los códigos de error !!

luk32:gcc -lz ./zlib.c
luk32:~/projects/tests$ ./a.out
Buffer was too small!

La compresión es a menudo ineficaz para insumos muy pequeños. Por lo tanto su predicción para el tamaño de búfer necesario es 2*strlen(istream) Fue una subestimación.

"Mejorado" zlib.c para comprobar lo que salió mal:

#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "zlib.h"
int main()
{
const char *istream = "some foo";
ulong destLen = strlen(istream);
char* ostream = malloc(2 * strlen(istream));
int res = compress(ostream, &destLen, istream, destLen + 1);
if(res == Z_BUF_ERROR){
printf("Buffer was too small!n");
return 1;
}
if(res ==  Z_MEM_ERROR){
printf("Not enough memory for compression!n");
return 2;
}
}

Después de leer cuidadosamente "Funciones de utilidad" de la documentación. Código correcto completo:

#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "zlib.h"
int main()
{
const char *istream = "some foo";
ulong srcLen = strlen(istream)+1;      // +1 for the trailing ``
ulong destLen = compressBound(srcLen); // this is how you should estimate size
// needed for the buffer
char* ostream = malloc(destLen);
int res = compress(ostream, &destLen, istream, srcLen);
// destLen is now the size of actuall buffer needed for compression
// you don"t want to uncompress whole buffer later, just the used part
if(res == Z_BUF_ERROR){
printf("Buffer was too small!n");
return 1;
}
if(res ==  Z_MEM_ERROR){
printf("Not enough memory for compression!n");
return 2;
}

const char *i2stream = ostream;
char* o2stream = malloc(srcLen);
ulong destLen2 = destLen; //destLen is the actual size of the compressed buffer
int des = uncompress(o2stream, &srcLen, i2stream, destLen2);
printf("%sn", o2stream);
return 0;
}

Prueba:

luk32:gcc -lz ./zlib.c
luk32:~/projects/tests$ ./a.out
some foo