COMPRESIÓN BASADA EN GRAMATICAS Para lograr comprimir se realizan los siguientes pasos: Primero se abre el archivo a comprimir y se van tomando conjuntos de 3 y 6 bytes. Los conjuntos de 3 bytes se ponen en un arreglo y los de 6 en otro. Se avanza por todo el arreglo de series de 3 bytes contando cuales se repiten 2 o más veces y se marcan. Se extraen solamente las series repetidas 2 o más veces a un nuevo arreglo evitando la repetición entre sí mismas. Se analiza todo el arreglo de series de 6 bytes partiendo cada serie en 2 partes de 3 bytes. Cada parte se busca en el arreglo de 3 bytes. Si ambas partes están en el arreglo de 3 bytes, se crea una producción. Nuevamente se analiza el arreglo de producciones para evitar repeticiones entre sí mismas. Ahora, se copia todo el archivo a un buffer en memoria y se va avanzando byte a byte. Se compara la posición actual del puntero con cada entrada de 6 bytes, si existe alguna concordancia, entonces se reemplazan esos 6 bytes por 1. Si no es así, ahora se compara con cada entrada de 3 bytes y se hace lo mismo. En caso de que no exista un patrón en las producciones de 6 y 3 bytes, se copia dicho byte al archivo de salida, es decir, el byte sin modificación. Por cada byte que se reemplaza, se va llenando una estructura de datos con la información de la gramática que lo contiene y el offset del byte en el archivo (para saber después donde reemplazar ese byte en la descompresión). Por último, se envía toda la información necesaria recopilada al archivo gramática el cual servirá para la descompresión. Para implementar la descompresión, solamente se hace todo este proceso en orden inverso, es decir, se lee el archivo compreso, se cargan las estructuras de datos del archivo gramática y se va analizando el archivo de entrada y expandiendo al archivo de salida utilizando información del archivo gramática. EJEMPLOS Ejemplo 1. Contenido: AAAABCDAAABCDEFGHIAAFGHIA AAA AAA AAB ABC BCD CDA DAA AAA AAB ABC BCD CDE DEF EFG FGH GHI HIA IAA AAF AFG FGH GHI HIA k k l m n k -> AAA l -> AAB m -> ABC n -> BCD o -> FGH p -> GHI q -> HIA [0] k -> AAA [1] m-> ABC [2] n -> BCD [3] o -> FGH r -> k m s -> k n t -> n k [0] r -> k m [1] s -> k n k l m n o p q o p q AAAABC AAABCD AABCDA ABCDAA BCDAAA CDAAAB DAAABC AAABCD AABCDE ABCDEF BCDEFG CDEFGH DEFGHI EFGHIA FGHIAA GHIAAF HIAAFG IAAFGH AAFGHI AFGHIA r s t s COMPRESO: 0D1E3IAA3IA Ejemplo 2.- Contenido: ABCDEFABCDEFGHIGHI ABC BCD CDE DEF EFA FAB ABC BCD CDE DEF EFG FGH GHI HIG IGH GHI k l m n k -> ABC l -> BCD m -> CDE n -> DEF o -> GHI [0] k -> ABC [1] n -> DEF [2] o -> GHI k l m n o o ABCDEF BCDEFA CDEFAB DEFABC EFABCD FABCDE ABCDEF BCDEFG CDEFGH DEFGHI EFGHIG FGHIGH GHIGHI p q p r s COMPRESO: 001 p -> k n q -> n k r -> n o s -> o o [0] p -> k n [1] s -> o o