Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1.0
1. Método de compresión 1
1.1. Ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Código fuente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2. Índice de clases 3
2.1. Lista de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3. Indice de archivos 5
3.1. Lista de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
5. Documentación de archivos 21
5.1. Referencia del Archivo src/huf.cpp . . . . . . . . . . . . . . . . . . . 21
5.2. Referencia del Archivo src/huffman.cpp . . . . . . . . . . . . . . . . 23
5.3. Referencia del Archivo src/huffman.h . . . . . . . . . . . . . . . . . 24
5.4. Referencia del Archivo src/node.cpp . . . . . . . . . . . . . . . . . . 25
5.5. Referencia del Archivo src/node.h . . . . . . . . . . . . . . . . . . . 26
5.6. Referencia del Archivo src/qsort.cpp . . . . . . . . . . . . . . . . . . 27
5.7. Referencia del Archivo src/qsort.h . . . . . . . . . . . . . . . . . . . 31
5.8. Referencia del Archivo src/types.h . . . . . . . . . . . . . . . . . . . 35
5.9. Referencia del Archivo src/unhuf.cpp . . . . . . . . . . . . . . . . . 37
5.10. Referencia del Archivo src/utils.cpp . . . . . . . . . . . . . . . . . . 39
5.11. Referencia del Archivo src/utils.h . . . . . . . . . . . . . . . . . . . 52
Capítulo 1
Método de compresión
1.1. Ejecución
Usar el comando huf para comprimir, pasando por parámetro el fichero que se quiere
comprimir.
Usar el comando unhuf para descomprimir, pasando por parámetro el fichero que se
quiere descomprimir.
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
Capítulo 2
Índice de clases
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
Capítulo 3
Indice de archivos
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
Capítulo 4
#include <huffman.h>
Métodos públicos
Atributos privados
Clase que modela la generación del árbol de codificación Huffman, a partir de una
fuente de memoria nula.
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Constructor de la clase Huffman. Tiene como parámetro una fuente de memoria nula.
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← Origen Fuente de memoria nula.
13 {
14
15 vector<Node *> vFuente(Origen.size());
16 int i = 0;
17
21 for ( FMN::iterator it = Origen.begin(); it != Origen.end(); it++, i++) {
22 Node *Leaf = new Node(it->first, it->second);
23 vFuente[i] = Leaf;
24 }
25 m_vFuente = vFuente;
26
27 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
4.1 Referencia de la Clase Huffman 9
47 {
48
57 int nLongitud = m_vFuente.size();
58
59 if (nLongitud == 1) {
60 return;
61 }
62
63 if (nLongitud > 2) {
64 m_vFuente = qsort(m_vFuente);
65 }
66
71 Node *NuevoNodo = m_vFuente[0]->merge(m_vFuente[1]);
72
76 vector<Node *>::iterator it = m_vFuente.begin();
77 it = m_vFuente.erase(it);
78 m_vFuente.erase(it);
79
80 m_vFuente.push_back(NuevoNodo);
81
86 if (nLongitud == 2)
87 return;
88
89 creaHuffman();
90 }
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Devuelve:
COD Código generado.
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
10 Documentación de las clases
99 {
100
101 Node Arbol = *m_vFuente[0];
102
103 return Arbol.DTA();
104
105 }
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Devuelve:
Node∗ Puntero al nodo raíz.
114 {
115 return m_vFuente[0];
116 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
4.1 Referencia de la Clase Huffman 11
src/huffman.h
src/huffman.cpp
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
12 Documentación de las clases
#include <node.h>
Diagrama de colaboración para Node:
m_pLeftSon
Node m_pRightSon
Métodos públicos
Node ()
Node (unsigned char cData, double dProb)
Node ∗ merge (Node ∗A)
void setProb (double dProb)
void setLeftSon (Node ∗pA)
void setRightSon (Node ∗pA)
void setIsLeaf (bool bIsLeaf)
void setData (unsigned char cData)
double getProb ()
Node ∗ getLeftSon ()
Node ∗ getRightSon ()
bool getIsLeaf ()
unsigned char getData ()
COD DTA ()
void _DTA (stack< unsigned char > S, Node ∗root)
Atributos públicos
Atributos privados
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
4.2 Referencia de la Clase Node 13
Fecha:
Julio 2008
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
4.2.2.1. Node::Node ()
Constructor por defecto. Inicializa el nodo como nodo intermedio sin hijos.
Definición en la línea 7 del archivo node.cpp.
Hace referencia a m_bIsLeaf, m_pLeftSon, y m_pRightSon.
Referenciado por merge().
7 {
8 m_bIsLeaf = false;
9 m_pLeftSon = 0;
10 m_pRightSon = 0;
11 }
Constructor sobrecargado. Inicializa el nodo como nodo hoja sin hijos, con el símbolo
pasado por parámetro y la probabilidad asociada.
Parámetros:
← cData Símbolo a almacenar en la hoja.
← dProb Probabilidad a almacenar en la hoja.
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
14 Documentación de las clases
20 {
21 m_dProb = dProb;
22 m_cData = cData;
23 m_bIsLeaf = true;
24 m_pLeftSon = 0;
25 m_pRightSon = 0;
26 }
Método que fusiona dos nodos creando un nodo intermedio que los acoge.
Definición en la línea 100 del archivo node.cpp.
Hace referencia a getProb(), m_dProb, Node(), setLeftSon(), setProb(), y setRight-
Son().
100 {
101 Node *Union = new Node();
102 Union->setProb(this->m_dProb + A->getProb());
103 Union->setLeftSon(this);
104 Union->setRightSon(A);
105
106 return Union;
107 }
Node::getProb
Node::Node
Node::merge Node::setLeftSon
Node::setProb
Node::setRightSon
31 {
32 m_dProb = dProb;
33 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
4.2 Referencia de la Clase Node 15
Parámetros:
← pA Puntero al nodo descendiente.
47 {
48 m_pLeftSon = pA;
49 }
Parámetros:
← pA Puntero al nodo descendiente.
56 {
57 m_pRightSon = pA;
58 }
Parámetros:
← bIsLeaf Booleano que establece la condición de hoja.
65 {
66 m_bIsLeaf = bIsLeaf;
67 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
16 Documentación de las clases
Parámetros:
← cData Caracter correspondiente al símbolo a almacenar.
161 {
162 m_cData = cData;
163 }
38 {
39 return m_dProb;
40 }
72 {
73 return m_pLeftSon;
74 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
4.2 Referencia de la Clase Node 17
79 {
80 return m_pRightSon;
81 }
86 {
87 return m_bIsLeaf;
88 }
93 {
94 return m_cData;
95 }
Método que encapsula llamadas a _DTA para poder realizar el recorrido en profundidad
del árbol.
Definición en la línea 113 del archivo node.cpp.
Hace referencia a _DTA(), m_bIsLeaf, m_CodigoFinal, m_CodigoTemporal, m_-
pLeftSon, y m_pRightSon.
Referenciado por Huffman::generaCodigo().
113 {
114 if (!m_bIsLeaf) {
115
116 if (m_pLeftSon) {
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
18 Documentación de las clases
Node::DTA Node::_DTA
134 {
135 if (!m_bIsLeaf) {
136 if (m_pLeftSon) {
137 S.push(’0’);
138 m_pLeftSon->_DTA(S, root);
139 S.pop();
140 }
141 if (m_pRightSon) {
142 S.push(’1’);
143 m_pRightSon->_DTA(S, root );
144 S.pop();
145 }
146 } else {
147 while (!S.empty()) {
148 unsigned char c = S.top();
149 S.pop();
150 m_CodigoHoja.push_back(c);
151 }
152 root->m_CodigoFinal[m_cData] = m_CodigoHoja;
153 }
154 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
4.2 Referencia de la Clase Node 19
Node::_DTA
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
20 Documentación de las clases
4.2.4.6. Node::m_CodigoTemporal
4.2.4.7. Node::m_CodigoHoja
4.2.4.8. Node::m_CodigoFinal
src/node.h
src/node.cpp
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
Capítulo 5
Documentación de archivos
src/huf.cpp
utils.h
types.h node.h
Funciones
int main (int argc, char ∗argv[ ])
24 {
25
26 if (argc == 1) {
27 cerr << "Uso: " << argv[0] << " origen [destino]" << endl;
22 Documentación de archivos
28 }
29
30 if (argc == 2) {
31 string sFile(argv[1]);
32 comprimeFichero(sFile);
33 } else if (argc == 3) {
34 string sFile(argv[1]);
35 string sFileOut(argv[2]);
36 comprimeFichero(sFile, sFileOut);
37 }
38
39 return 0;
40 }
creaOcteto bin2char
serializaArbol Node::getIsLeaf
Node::getLeftSon
Node::getRightSon
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.2 Referencia del Archivo src/huffman.cpp 23
src/huffman.cpp
qsort.h huffman.h
types.h node.h
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
24 Documentación de archivos
src/huffman.h
types.h node.h
src/huffman.h
src/huffman.cpp src/utils.cpp
Clases
class Huffman
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.4 Referencia del Archivo src/node.cpp 25
src/node.cpp
types.h node.h
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
26 Documentación de archivos
src/node.h
Clases
class Node
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.6 Referencia del Archivo src/qsort.cpp 27
src/qsort.cpp
qsort.h
types.h node.h
Funciones
int particion (Node ∗∗frecuencias, int izquierda, int derecha)
void _quicksort (Node ∗∗frecuencias, int first, int last)
vector< Node ∗ > qsort (vector< Node ∗ > fuente)
Algoritmo de QuicSort.
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
↔ frecuencias Vector de punteros a Node que se ha de ordenar.
← first Priemera posición del vector que se tiene que ordenar.
← last Última posición del vector que se tiene que ordenar.
60 {
61 int posicionActual;
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
28 Documentación de archivos
_quicksort particion
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← frecuencias Vector de punteros a Node.
← izquierda Límite izquierdo.
← derecha Límite derecho.
Devuelve:
Posició que marca la partición.
17 {
18 int posicion = izquierda;
19 while ( true ) {
20 while ( frecuencias[ posicion ]->getProb() <= frecuencias[ derecha ]->getProb() && pos
21 --derecha;
22 if ( posicion == derecha )
23 return posicion;
24 if ( frecuencias[ posicion ]->getProb() > frecuencias[ derecha ]->getProb()) {
25
26 Node *temp;
27 temp = frecuencias[ posicion ];
28 frecuencias[ posicion ] = frecuencias[ derecha ];
29 frecuencias[ derecha ] = temp;
30
31 posicion = derecha;
32 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.6 Referencia del Archivo src/qsort.cpp 29
33 while ( frecuencias[ izquierda ]->getProb() <= frecuencias[ posicion ]->getProb() && izquierda !=
34 ++izquierda;
35 if ( posicion == izquierda )
36 return posicion;
37 if ( frecuencias[ izquierda ]->getProb() > frecuencias[ posicion ]->getProb() ) {
38
39 Node *temp;
40 temp = frecuencias[ posicion ];
41 frecuencias[ posicion ] = frecuencias[ izquierda ];
42 frecuencias[ izquierda ] = temp;
43
44 posicion = izquierda;
45 }
46 }
47 }
Parámetros:
fuente Vector de punteros a nodos para ordenar.
Devuelve:
Vector ordenado.
75 {
76
77
78 Node **_fuente = new Node *[fuente.size()];
79 vector<Node *> _fuente_ordenada (fuente.size());
80
81 for (unsigned int i = 0; i < fuente.size(); i++) {
82 _fuente[i] = fuente[i];
83 }
84
85 _quicksort (_fuente, 0, fuente.size() - 1);
86
87 for (unsigned int i = 0; i < fuente.size(); i++) {
88 _fuente_ordenada[i] = _fuente[i];
89 }
90
91 delete[] _fuente;
92
93 return _fuente_ordenada;
94
95 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
30 Documentación de archivos
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.7 Referencia del Archivo src/qsort.h 31
src/qsort.h
types.h node.h
src/qsort.h
src/huffman.cpp src/qsort.cpp
Funciones
Algoritmo de QuicSort.
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
↔ frecuencias Vector de punteros a Node que se ha de ordenar.
← first Priemera posición del vector que se tiene que ordenar.
← last Última posición del vector que se tiene que ordenar.
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
32 Documentación de archivos
60 {
61 int posicionActual;
62 if ( first >= last )
63 return;
64 posicionActual = particion( frecuencias, first, last );
65 _quicksort( frecuencias, first, posicionActual - 1 );
66 _quicksort( frecuencias, posicionActual + 1, last );
67 }
_quicksort
_quicksort particion
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← frecuencias Vector de punteros a Node.
← izquierda Límite izquierdo.
← derecha Límite derecho.
Devuelve:
Posició que marca la partición.
17 {
18 int posicion = izquierda;
19 while ( true ) {
20 while ( frecuencias[ posicion ]->getProb() <= frecuencias[ derecha ]->getProb() && pos
21 --derecha;
22 if ( posicion == derecha )
23 return posicion;
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.7 Referencia del Archivo src/qsort.h 33
Parámetros:
fuente Vector de punteros a nodos para ordenar.
Devuelve:
Vector ordenado.
75 {
76
77
78 Node **_fuente = new Node *[fuente.size()];
79 vector<Node *> _fuente_ordenada (fuente.size());
80
81 for (unsigned int i = 0; i < fuente.size(); i++) {
82 _fuente[i] = fuente[i];
83 }
84
85 _quicksort (_fuente, 0, fuente.size() - 1);
86
87 for (unsigned int i = 0; i < fuente.size(); i++) {
88 _fuente_ordenada[i] = _fuente[i];
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
34 Documentación de archivos
89 }
90
91 delete[] _fuente;
92
93 return _fuente_ordenada;
94
95 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.8 Referencia del Archivo src/types.h 35
src/types.h
src/types.h
Tipos definidos
typedef map< unsigned char, double > FMN
typedef map< unsigned char, string > COD
5.8.1.1. COD
5.8.1.2. FMN
Definición del tipo de datos que modela una fuente de memoria nula.
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
36 Documentación de archivos
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.9 Referencia del Archivo src/unhuf.cpp 37
#include "utils.h"
Dependencia gráfica adjunta para unhuf.cpp:
src/unhuf.cpp
utils.h
types.h node.h
Funciones
3 {
4
5 if (argc == 1) {
6 cerr << "Uso: " << argv[0] << " origen [destino]" << endl;
7 }
8
9 if (argc == 2) {
10 string sFile(argv[1]);
11 descomprimeFichero(sFile);
12 } else if (argc == 3) {
13 string sFile(argv[1]);
14 string sFileOut(argv[2]);
15 descomprimeFichero(sFile, sFileOut);
16 }
17
18 return 0;
19 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
38 Documentación de archivos
bin2char
Node::setData
Node::setIsLeaf
deserializaArbol
Node::setLeftSon
Node::setRightSon
main descomprimeFichero
Node::getData
decodifica Node::getIsLeaf
Node::getLeftSon
leerComprimido Node::getRightSon
char2bin
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.10 Referencia del Archivo src/utils.cpp 39
src/utils.cpp
types.h node.h
Funciones
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
40 Documentación de archivos
Parámetros:
← sSecuencia Secuencia binaria a convertir.
Devuelve:
unsigned char
16 {
17
18 if (sSecuencia.size() != 8) return ’\0’;
19
20 int nLongitud = static_cast<int>(sSecuencia.size());
21 unsigned int nSum = 0;
22 for (int i = 0; i < nLongitud; i++) {
23 unsigned char c = sSecuencia[i];
24 int n = 0;
25 if (c == ’0’) {
26 n = 0;
27 } else if (c == ’1’){
28 n = 1;
29 }
30 nSum += static_cast<unsigned int>(n*pow(2.0, (nLongitud - 1) - i));
31 }
32 unsigned char cOcteto;
33 cOcteto = static_cast<unsigned char>(nSum);
34 return cOcteto;
35 }
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← cData Caracter a convertir a secuencia binaria.
Devuelve:
string
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.10 Referencia del Archivo src/utils.cpp 41
47 {
48 string sBuffer;
49 for (unsigned char i = cData; i > 1; i/=2) {
50 unsigned char nResto = i%2;
51 if (nResto == 0) {
52 sBuffer.push_back(’0’);
53 } else {
54 sBuffer.push_back(’1’);
55 }
56 }
57 sBuffer.push_back(’1’);
58 string sBufferFinal;
59 int nLongitud = static_cast<int>(sBuffer.size());
60 for (int i = 0; i < (8 - nLongitud); i++ ) sBufferFinal.push_back(’0’);
61 for(int i = nLongitud - 1; i >= 0; i-- ) sBufferFinal.push_back(sBuffer[i]);
62 return sBufferFinal;
63 }
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← sFile Nombre del fichero fuente.
← sFileOut Nombre del fichero destino.
188 {
189
190 cout << "### COMPRIMIENDO ###" << endl;
191
192 /*
193 * En primer lugar se crea la fuente de memoria nula leyendo el
194 * fichero fuente. Inmediatamente después se crea el árbol
195 * de código Huffman.
196 */
197 FMN frec;
198 frec = leerFuente(sFile);
199 Huffman huf(frec);
200 huf.creaHuffman();
201 COD Codigo = huf.generaCodigo();
202
203 /*
204 * Si no se especifica un nombre de fichero de salida, se añade la
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
42 Documentación de archivos
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.10 Referencia del Archivo src/utils.cpp 43
267
268 fSalida.close();
269
270 }
creaOcteto bin2char
serializaArbol Node::getIsLeaf
Node::getLeftSon
Node::getRightSon
Función que crea un unsigned char, a partir de una secuencia de 0s y 1s en una cadena.
Además establece en un parámetro de salida el numero de ceros de relleno para llegar
a 8 bits.
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← sCodigo Secuencia de la que obtener el octeto.
→ nCeros Número de ceros extras.
Devuelve:
unsigned char
111 {
112
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
44 Documentación de archivos
creaOcteto bin2char
Función que dada una secuencia de bits y el árbol, decodifica dicha secuencia de-
volviendo el símbolo asociado.
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
↔ sSecuencia Secuencia de bits a decodificar.
← Arbol Puntero al árbol.
Devuelve:
unsigned char
310 {
311 if (Arbol->getIsLeaf()) {
312 cout << " " << Arbol->getData();
313 return Arbol->getData();
314 } else {
315 unsigned char cBit = sSecuencia[0];
316 cout << cBit;
317 sSecuencia.erase(0,1);
318 if (cBit == ’1’) {
319 return decodifica(sSecuencia, Arbol->getRightSon());
320 } else if (cBit == ’0’) {
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.10 Referencia del Archivo src/utils.cpp 45
Node::getData
Node::getIsLeaf
decodifica
Node::getLeftSon
Node::getRightSon
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← sFile Nombre del fichero comprimido.
← sFileOut Nombre del fichero de salida.
335 {
336 int nLenArbol;
337
338 /*
339 * En primer lugar leeremos el fichero comprimido.
340 */
341 cout << "### DESCOMPRIMIENDO ###" << endl;
342
343 cout << "Leyedo comprimido...";
344 string bufferComprimido = leerComprimido(sFile, nLenArbol);
345 cout << " OK" << endl;
346 cout << "Fichero comprimido (sin el primer entero): " << bufferComprimido << endl;
347 cout << "Tamaño del buffer: " << bufferComprimido.size() << endl;
348 cout << "Arbol de tamaño (bits): " << nLenArbol << endl;
349
350 Node *Arbol = new Node();
351 string subSecuencia = bufferComprimido.substr(0, nLenArbol);
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
46 Documentación de archivos
352 cout << "Arbol serializado: " << subSecuencia << endl;
353
354 /*
355 * Tras obtener el código asociado al árbol serializado,
356 * lo deserializamos y obtenemos el buffer de datos.
357 */
358 cout << "Deserializando arbol...";
359 deserializaArbol(subSecuencia, Arbol);
360 cout << " OK" << endl;
361
362 string bufferDatosTerm = bufferComprimido.substr(nLenArbol, bufferComprimido.size() - n
363 string bufferDatos = bufferDatosTerm.substr(0, bufferDatosTerm.size() - 8);
364 string bufferTerm = bufferDatosTerm.substr(bufferDatosTerm.size() - 8, 8);
365
366
367 int nLongitud = static_cast<int>(bufferTerm.size());
368 cout << "Terminador (secuencia de bits): " << bufferTerm << endl;
369 cout << "Tamaño del terminador (nº de bits): " << nLongitud << endl;
370
371 unsigned int nCeros = static_cast<unsigned int>(bin2char(bufferTerm));
372
373 cout << "Numero de ceros de relleno: " << nCeros << endl;
374
375 ofstream fSalida(sFileOut.c_str(), ofstream::binary);
376
377 cout << bufferDatos << endl;
378 bufferDatos = bufferDatos.substr(0, bufferDatos.size() - nCeros);
379 cout << bufferDatos << endl;
380
381 /*
382 * Una vez leídos los datos, decodificamos mediante el árbol.
383 */
384 while (bufferDatos.size() > 1) {
385 cout << "Cod. Huff: ";
386 unsigned char cData = decodifica(bufferDatos, Arbol);
387 cout << endl;
388 char buffer[1];
389 buffer[0] = static_cast<char>(cData);
390 fSalida.write(buffer, 1);
391 }
392
393 fSalida.close();
394 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.10 Referencia del Archivo src/utils.cpp 47
bin2char
Node::setData
Node::setIsLeaf
deserializaArbol
Node::setLeftSon
Node::setRightSon
descomprimeFichero
Node::getData
decodifica Node::getIsLeaf
Node::getLeftSon
leerComprimido Node::getRightSon
char2bin
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← Arbol Puntero al árbol deserializado.
→ sSecuencia Árbol serializado.
158 {
159 unsigned char cBit = sSecuencia[0];
160 if (cBit == ’1’ ) {
161 unsigned char cOcteto = bin2char(sSecuencia.substr(1,8));
162 cout<< "Codigo: "<<cOcteto<<" Secuencia: "<< sSecuencia.substr(1,8)<<endl;
163 Arbol->setIsLeaf(true);
164 Arbol->setData(cOcteto);
165 sSecuencia.erase(0,9);
166 } else {
167 sSecuencia.erase(0,1);
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
48 Documentación de archivos
bin2char
Node::setData
deserializaArbol Node::setIsLeaf
Node::setLeftSon
Node::setRightSon
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← sFile Nombre del fichero fuente.
→ nLenArbol Número de bits del árbol;
280 {
281
282 ifstream file(sFile.c_str(), ifstream::binary);
283 unsigned char cData;
284 char buffer[1];
285
286 string sSecuencia("");
287
288 file >> nLenArbol;
289
290 while (!file.read(buffer, 1).eof()) {
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.10 Referencia del Archivo src/utils.cpp 49
leerComprimido char2bin
Módulo que lee un fichero de texto, y calcula la frecuencia de aparición de cada sím-
bolo.
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← sFile Dirección absoluta o relativa de la fuente.
Devuelve:
Mapa de caracteres y frecuencia de aparición.
74 {
75 FMN caracterFrecuencia;
76 ifstream file(sFile.c_str(), ifstream::binary);
77 unsigned char cCaracter;
78 char buffer[1];
79
80 while (!file.read(buffer, 1).eof()) {
81 cCaracter = static_cast<unsigned char>(buffer[0]);
82 if (caracterFrecuencia.find(cCaracter) != caracterFrecuencia.end()) {
83 caracterFrecuencia[cCaracter]++;
84 } else {
85 caracterFrecuencia[cCaracter] = 1.;
86 }
87 }
88
89 FMN::iterator it;
90 unsigned int unTam = caracterFrecuencia.size();
91 for (it = caracterFrecuencia.begin(); it != caracterFrecuencia.end(); it++) {
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
50 Documentación de archivos
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← Arbol Puntero al árbol a serializar.
133 {
134
135 if (!Arbol->getIsLeaf()) {
136 sSecuencia.push_back(’0’);
137 Node* hijoIzquierdo = Arbol->getLeftSon();
138 serializaArbol(sSecuencia, hijoIzquierdo);
139 Node* hijoDerecho = Arbol->getRightSon();
140 serializaArbol(sSecuencia, hijoDerecho);
141 } else {
142 sSecuencia.push_back(’1’);
143 unsigned char cData = Arbol->getData();
144 string sBuffer = char2bin(cData);
145 sSecuencia.append(sBuffer);
146 cout<< "Codigo: "<<cData<<" Secuencia: "<< sBuffer<<endl;
147 }
148 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.10 Referencia del Archivo src/utils.cpp 51
char2bin
Node::getData
serializaArbol Node::getIsLeaf
Node::getLeftSon
Node::getRightSon
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
52 Documentación de archivos
src/utils.h
types.h node.h
src/utils.h
Funciones
FMN leerFuente (string sFile)
unsigned char creaOcteto (string sCodigo, int &nCeros)
void comprimeFichero (string sFile, string sFileOut="")
void serializaArbol (string &sSecuencia, Node ∗Arbol)
void deserializaArbol (string &sSecuencia, Node ∗Arbol)
string leerComprimido (string sFile, int &nLenArbol)
unsigned char decodifica (string &sSecuencia, Node ∗Arbol)
void descomprimeFichero (string sFile, string sFileOut="")
unsigned char bin2char (string sSecuencia)
string char2bin (unsigned char cData)
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.11 Referencia del Archivo src/utils.h 53
Parámetros:
← sSecuencia Secuencia binaria a convertir.
Devuelve:
unsigned char
16 {
17
18 if (sSecuencia.size() != 8) return ’\0’;
19
20 int nLongitud = static_cast<int>(sSecuencia.size());
21 unsigned int nSum = 0;
22 for (int i = 0; i < nLongitud; i++) {
23 unsigned char c = sSecuencia[i];
24 int n = 0;
25 if (c == ’0’) {
26 n = 0;
27 } else if (c == ’1’){
28 n = 1;
29 }
30 nSum += static_cast<unsigned int>(n*pow(2.0, (nLongitud - 1) - i));
31 }
32 unsigned char cOcteto;
33 cOcteto = static_cast<unsigned char>(nSum);
34 return cOcteto;
35 }
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← cData Caracter a convertir a secuencia binaria.
Devuelve:
string
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
54 Documentación de archivos
47 {
48 string sBuffer;
49 for (unsigned char i = cData; i > 1; i/=2) {
50 unsigned char nResto = i%2;
51 if (nResto == 0) {
52 sBuffer.push_back(’0’);
53 } else {
54 sBuffer.push_back(’1’);
55 }
56 }
57 sBuffer.push_back(’1’);
58 string sBufferFinal;
59 int nLongitud = static_cast<int>(sBuffer.size());
60 for (int i = 0; i < (8 - nLongitud); i++ ) sBufferFinal.push_back(’0’);
61 for(int i = nLongitud - 1; i >= 0; i-- ) sBufferFinal.push_back(sBuffer[i]);
62 return sBufferFinal;
63 }
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← sFile Nombre del fichero fuente.
← sFileOut Nombre del fichero destino.
188 {
189
190 cout << "### COMPRIMIENDO ###" << endl;
191
192 /*
193 * En primer lugar se crea la fuente de memoria nula leyendo el
194 * fichero fuente. Inmediatamente después se crea el árbol
195 * de código Huffman.
196 */
197 FMN frec;
198 frec = leerFuente(sFile);
199 Huffman huf(frec);
200 huf.creaHuffman();
201 COD Codigo = huf.generaCodigo();
202
203 /*
204 * Si no se especifica un nombre de fichero de salida, se añade la
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.11 Referencia del Archivo src/utils.h 55
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
56 Documentación de archivos
267
268 fSalida.close();
269
270 }
creaOcteto bin2char
serializaArbol Node::getIsLeaf
Node::getLeftSon
Node::getRightSon
Función que crea un unsigned char, a partir de una secuencia de 0s y 1s en una cadena.
Además establece en un parámetro de salida el numero de ceros de relleno para llegar
a 8 bits.
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← sCodigo Secuencia de la que obtener el octeto.
→ nCeros Número de ceros extras.
Devuelve:
unsigned char
111 {
112
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.11 Referencia del Archivo src/utils.h 57
creaOcteto bin2char
Función que dada una secuencia de bits y el árbol, decodifica dicha secuencia de-
volviendo el símbolo asociado.
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
↔ sSecuencia Secuencia de bits a decodificar.
← Arbol Puntero al árbol.
Devuelve:
unsigned char
310 {
311 if (Arbol->getIsLeaf()) {
312 cout << " " << Arbol->getData();
313 return Arbol->getData();
314 } else {
315 unsigned char cBit = sSecuencia[0];
316 cout << cBit;
317 sSecuencia.erase(0,1);
318 if (cBit == ’1’) {
319 return decodifica(sSecuencia, Arbol->getRightSon());
320 } else if (cBit == ’0’) {
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
58 Documentación de archivos
Node::getData
Node::getIsLeaf
decodifica decodifica
Node::getLeftSon
Node::getRightSon
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← sFile Nombre del fichero comprimido.
← sFileOut Nombre del fichero de salida.
335 {
336 int nLenArbol;
337
338 /*
339 * En primer lugar leeremos el fichero comprimido.
340 */
341 cout << "### DESCOMPRIMIENDO ###" << endl;
342
343 cout << "Leyedo comprimido...";
344 string bufferComprimido = leerComprimido(sFile, nLenArbol);
345 cout << " OK" << endl;
346 cout << "Fichero comprimido (sin el primer entero): " << bufferComprimido << endl;
347 cout << "Tamaño del buffer: " << bufferComprimido.size() << endl;
348 cout << "Arbol de tamaño (bits): " << nLenArbol << endl;
349
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.11 Referencia del Archivo src/utils.h 59
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
60 Documentación de archivos
bin2char
Node::setData
Node::setIsLeaf
deserializaArbol
Node::setLeftSon
Node::setRightSon
descomprimeFichero
Node::getData
decodifica Node::getIsLeaf
Node::getLeftSon
leerComprimido Node::getRightSon
char2bin
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← Arbol Puntero al árbol deserializado.
→ sSecuencia Árbol serializado.
158 {
159 unsigned char cBit = sSecuencia[0];
160 if (cBit == ’1’ ) {
161 unsigned char cOcteto = bin2char(sSecuencia.substr(1,8));
162 cout<< "Codigo: "<<cOcteto<<" Secuencia: "<< sSecuencia.substr(1,8)<<endl;
163 Arbol->setIsLeaf(true);
164 Arbol->setData(cOcteto);
165 sSecuencia.erase(0,9);
166 } else {
167 sSecuencia.erase(0,1);
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.11 Referencia del Archivo src/utils.h 61
bin2char
Node::setData
deserializaArbol
deserializaArbol
Node::setIsLeaf
Node::setLeftSon
Node::setRightSon
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← sFile Nombre del fichero fuente.
→ nLenArbol Número de bits del árbol;
280 {
281
282 ifstream file(sFile.c_str(), ifstream::binary);
283 unsigned char cData;
284 char buffer[1];
285
286 string sSecuencia("");
287
288 file >> nLenArbol;
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
62 Documentación de archivos
289
290 while (!file.read(buffer, 1).eof()) {
291 cData = static_cast<unsigned char>(buffer[0]);
292 string sBuffer = char2bin(cData);
293 sSecuencia.append(sBuffer);
294 }
295 file.close();
296 return sSecuencia;
297
298 }
leerComprimido char2bin
Módulo que lee un fichero de texto, y calcula la frecuencia de aparición de cada sím-
bolo.
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← sFile Dirección absoluta o relativa de la fuente.
Devuelve:
Mapa de caracteres y frecuencia de aparición.
74 {
75 FMN caracterFrecuencia;
76 ifstream file(sFile.c_str(), ifstream::binary);
77 unsigned char cCaracter;
78 char buffer[1];
79
80 while (!file.read(buffer, 1).eof()) {
81 cCaracter = static_cast<unsigned char>(buffer[0]);
82 if (caracterFrecuencia.find(cCaracter) != caracterFrecuencia.end()) {
83 caracterFrecuencia[cCaracter]++;
84 } else {
85 caracterFrecuencia[cCaracter] = 1.;
86 }
87 }
88
89 FMN::iterator it;
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
5.11 Referencia del Archivo src/utils.h 63
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat
Parámetros:
← Arbol Puntero al árbol a serializar.
133 {
134
135 if (!Arbol->getIsLeaf()) {
136 sSecuencia.push_back(’0’);
137 Node* hijoIzquierdo = Arbol->getLeftSon();
138 serializaArbol(sSecuencia, hijoIzquierdo);
139 Node* hijoDerecho = Arbol->getRightSon();
140 serializaArbol(sSecuencia, hijoDerecho);
141 } else {
142 sSecuencia.push_back(’1’);
143 unsigned char cData = Arbol->getData();
144 string sBuffer = char2bin(cData);
145 sSecuencia.append(sBuffer);
146 cout<< "Codigo: "<<cData<<" Secuencia: "<< sBuffer<<endl;
147 }
148 }
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
64 Documentación de archivos
char2bin
Node::getData
serializaArbol
serializaArbol
Node::getIsLeaf
Node::getLeftSon
Node::getRightSon
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
Índice alfabético
_DTA getData
Node, 18 Node, 17
_quicksort getIsLeaf
qsort.cpp, 27 Node, 17
qsort.h, 31 getLeftSon
Node, 16
bin2char getProb
utils.cpp, 39 Node, 16
utils.h, 52 getRightSon
Node, 16
char2bin getTree
utils.cpp, 40 Huffman, 10
utils.h, 53
COD huf.cpp
types.h, 35 main, 21
comprimeFichero Huffman, 7
utils.cpp, 41 creaHuffman, 8
utils.h, 54 generaCodigo, 9
creaHuffman getTree, 10
Huffman, 8 Huffman, 8
creaOcteto m_vFuente, 10
utils.cpp, 43
utils.h, 56 leerComprimido
utils.cpp, 48
decodifica utils.h, 61
utils.cpp, 44 leerFuente
utils.h, 57 utils.cpp, 49
descomprimeFichero utils.h, 62
utils.cpp, 45
utils.h, 58 m_bIsLeaf
deserializaArbol Node, 19
utils.cpp, 47 m_cData
utils.h, 60 Node, 19
DTA m_CodigoFinal
Node, 17 Node, 20
m_CodigoHoja
FMN Node, 20
types.h, 35 m_CodigoTemporal
Node, 19
generaCodigo m_dProb
Huffman, 9 Node, 19
66 ÍNDICE ALFABÉTICO
m_pLeftSon qsort, 33
Node, 19
m_pRightSon serializaArbol
Node, 19 utils.cpp, 50
m_vFuente utils.h, 63
Huffman, 10 setData
main Node, 15
huf.cpp, 21 setIsLeaf
unhuf.cpp, 37 Node, 15
merge setLeftSon
Node, 14 Node, 14
setProb
Node, 12 Node, 14
_DTA, 18 setRightSon
DTA, 17 Node, 15
getData, 17 src/huf.cpp, 21
getIsLeaf, 17 src/huffman.cpp, 23
getLeftSon, 16 src/huffman.h, 24
getProb, 16 src/node.cpp, 25
getRightSon, 16 src/node.h, 26
m_bIsLeaf, 19 src/qsort.cpp, 27
m_cData, 19 src/qsort.h, 31
m_CodigoFinal, 20 src/types.h, 35
m_CodigoHoja, 20 src/unhuf.cpp, 37
m_CodigoTemporal, 19 src/utils.cpp, 39
m_dProb, 19 src/utils.h, 52
m_pLeftSon, 19
m_pRightSon, 19 types.h
merge, 14 COD, 35
Node, 13 FMN, 35
setData, 15
setIsLeaf, 15 unhuf.cpp
setLeftSon, 14 main, 37
setProb, 14 utils.cpp
setRightSon, 15 bin2char, 39
char2bin, 40
particion comprimeFichero, 41
qsort.cpp, 28 creaOcteto, 43
qsort.h, 32 decodifica, 44
descomprimeFichero, 45
qsort deserializaArbol, 47
qsort.cpp, 29 leerComprimido, 48
qsort.h, 33 leerFuente, 49
qsort.cpp serializaArbol, 50
_quicksort, 27 utils.h
particion, 28 bin2char, 52
qsort, 29 char2bin, 53
qsort.h comprimeFichero, 54
_quicksort, 31 creaOcteto, 56
particion, 32 decodifica, 57
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
ÍNDICE ALFABÉTICO 67
descomprimeFichero, 58
deserializaArbol, 60
leerComprimido, 61
leerFuente, 62
serializaArbol, 63
Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen