• Sábado 4 de Mayo de 2024, 18:20

Autor Tema:  Compresion  (Leído 2408 veces)

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Compresion
« en: Domingo 21 de Mayo de 2006, 02:25 »
0
Hola.
Bueno, lo que quiero es saber la mejor forma de comprimir un archivo y tengo un idea, pero tiene sus problemas:
Tengo un archivo de X tamaño.
Leo sierto numero de bits que es determinado por el tamaño del archivo (tiene que ser asi, porque es la unica forma de que no se sature la memoria), a esto lo llamo bloque.
Tomo este bloque y lo "desdoblo" en un orden ascendente de bits (pack("b*", bloque)) y remplaso sierta combinacion de unos y ceros por otros numeros.
El problema es que al "desdoblarlo" el tamaño del archivo queda mucho mas grande y al remplasar, el archivo queda mas grande.
El error es que al pasarlo a bits cada caractel queda en 8 bits de tamaño (es decir, la letra "a" queda en 8 unos y ceros, que cada uno ocupa 8 bits de taño)
Entonces, como seria el algoritmo perfecto para esto?
Gracias.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Compresion
« Respuesta #1 en: Domingo 21 de Mayo de 2006, 05:42 »
0
yo hice un algoritmo de compresion medio choto que funciono, solo funciona para texto.
es asi:
el programa lee el archivo de texto, se fija los caracteres que no se usan y hace una tabla.
luego lee el archivo buscando las combinaciones de dos letras que mas se repiten y selecciona las N mas repetidas, elije los N primeros caracteres sin usar y remplaza esas duplas por estos caracteres, luego escribe una cabecera con la asignacion de caracteres y duplas.
si lo haces recursivamente sobre un archivo aleatorio ( yo usaba los man de linux :P ), podes llegar a comprimir un archivo al 60% de su tamaño.

eso es todo.

(no se mucho de algoritmos de compresion ese se me ocurrio y funciono)

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Compresion
« Respuesta #2 en: Domingo 21 de Mayo de 2006, 16:15 »
0
Creo que asi funcionava el LZV1, pero encontr uno mejor:
http://en.wikipedia.org/wiki/LZO
Gracias por la idea!
 :hola:
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Compresion
« Respuesta #3 en: Miércoles 24 de Mayo de 2006, 02:09 »
0
Lo que decis se llama Huffman, y LZW es una libreria para esto, creo que las imagenes .gif usan este algoritmo
Aqui hay mas info:
http://www.perlmonks.org/?node_id=270016
 :smartass:
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Compresion
« Respuesta #4 en: Sábado 24 de Junio de 2006, 01:49 »
0
:o Use aquella idea de combertir todo en bits y remplazarlo por caractles.
Es mu sinple, solo hago un loop que crea las caracteles ascii (33-256) y otro loop o bucle que toma el archivo, lo lee (con sysread) y crea sierto numero de bloques dependiendo de el tamaño del archivo.
Al final el resultado es comparable al del algoritmo compress de Unix, deve de funcionar con binarios o archivos ofuscados como base de datos.
Bueno, lo posteo por si sirve de algo  ;)
 :hola:
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Bicholey

  • Moderador
  • ******
  • Mensajes: 1234
    • Ver Perfil
Re: Compresion
« Respuesta #5 en: Lunes 31 de Julio de 2006, 20:16 »
0
:P  :P  :P  :P


WOW fascinante.
[size=109]LOS GATOS SIEMPRE CAEMOS DE PIE !!![/size]


su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Compresion
« Respuesta #6 en: Lunes 31 de Julio de 2006, 22:05 »
0
El problema es cuando el archivo es de 1M o menos, queda un poco mas grande por la diferencia en cada bloque.  :rolleyes:
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.