C/Visual C - compresor y descompresor

 
Vista:

compresor y descompresor

Publicado por esteban (6 intervenciones) el 25/10/2004 03:32:47
como puedo hacer un compresor y descompresor de archivos en c++ que tome un archivo cualquiera y lo comprima para luego descomprimirlo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:compresor y descompresor

Publicado por Eleazar (25 intervenciones) el 25/10/2004 16:44:07
Primero que nada, debes entender cómo funciona el algoritmo de un compresor. Si quieres que sea Loosy (con pérdida de datos) o looseless (sin pérdida de datos).

Te recomiendo que investigues un poco sobre ese tema antes de empezar porque hacer un compresor no es nada fácil....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:compresor y descompresor (1)

Publicado por fernando.gomez (1603 intervenciones) el 26/10/2004 00:26:53
Quizás puedas emplear las librerías de WinZip, porque como Eleazar dice, no es fácil hacer un compresor.

En una ocasión, yo hice un compresor sencillo, el cuál solamente omitía los espacios en blanco. Un ejemplo. Considera la siguiente estructura:

#define STR_SIZE 512

struct DIRECCION
{
char szCalleYNumero[STR_SIZE];
char szColonia[STR_SIZE];
char szCiudad[STR_SIZE];
char szEstado[STR_SIZE];
char szCPostal[5+1];
};

El valor en tamaño de nuestra estructura (es decir, sizeof(ADDRESS)) es la suma del tamaño de todos sus miembros. Así, tenemos que el valor es de 4 miembros de 512 bytes (porque char es un byte, por los 512 de STR_SIZE) más seis bytes del código postal, tenemos una estructura de 2054 bytes.

Escogí 512 bytes de tamaño para caracteres, para que mis variables miembro tengan suficiente tamaño. Ni que decir tiene de que hay formas mejores de optimizar el espacio, pero bueno, esto sirve para ejemplificar mi punto.

Ahora bien, supongamos que quieres serializar una instancia de esta estructura en binario. Antes, habría algo así:
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:compresor y descompresor (2)

Publicado por fernando.gomez (1603 intervenciones) el 26/10/2004 00:27:24

DIRECCION objDireccion;

memset(&objDireccion, 0, sizeof(DIRECCION));
strcpy(objDireccion.szCalleYNumero, "Altadena 118");
strcpy(objDireccion.szColonia, "Napoles");
strcpy(objDireccion.szCiudad, "Mexico");
strcpy(objDireccion.szEstado, "Distrito Federal");
strcpy(objDireccion.szCPostal, "03810");

Por ejemplo, el campo DIRECCION::szCiudad contiene "Mexico", que son seis letras (bytes). ¡Tienes un campo de 512 bytes y sólo empleas seis! Claro, pudiese haber direcciones que emplearan mucho más. Entonces, cuando serialices, tendrías un archivo que, en la parte de ciudad, tendría la palabra Mejico seguido de 506 caracteres en blanco, esto es, 506 bytes.

Sin embargo, una variable short ocupa dos bytes y tiene un rango de –32,768 a 32,767. Entonces, se me ocurrió, antes de cada miembro de DIRECCION, inserto dos bytes que representan el tamaño vacío del campo (en este caso 506). Así, reduje el tamaño de mi variable de 512 bytes a tan sólo 8 (seis de "Mexico" más dos de mi variable short).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:compresor y descompresor (3)

Publicado por fernando.gomez (1603 intervenciones) el 26/10/2004 00:27:50
A la hora de descomprimirlo, leo los primeros dos bytes. En base a este valor y a STR_SIZE, determino cuántos bytes he de copiar y que corresponden a mi variable szCiudad (en este caso, 512 - 506 copio los siguientes 6 bytes, que corresponden a la palabra Mexico). Y ahora sí, puedo rellenar mi variable szCiudad con "Mexico" más 506 bytes nulos.

No conozco los algoritmos de compresión, sin embargo supongo que deben de hacer algo parecido para cadenas de texto. Yo hice un programa con un método como el que te describo hace tiempo. El programa tenía que transferir bases de datos (de más de diez gigabytes) entre computadoras por Internet. Entonces, había que comprimir los datos. Y en ese caso, pasaba mucho el ejemplo: un campo de la base de datos era de 100 caracteres, y tan solo se empleaban cinco...

Espero que mi ejemplo te sirva de guía.

Saludos,

Fernando.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:compresor y descompresor (3)

Publicado por Ismael (4 intervenciones) el 26/10/2004 22:30:31
En
http.//programandoenc.webcindario.com
tienes un programa compresor/descompresor en C según el algoritmo de Huffman.
Saludos

Ismael
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar