Sie sind auf Seite 1von 71

Compresor de Huffman (rg08)

1.0

Generado por Doxygen 1.5.5

Tue Jun 24 20:41:40 2008


Índice general

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

4. Documentación de las clases 7


4.1. Referencia de la Clase Huffman . . . . . . . . . . . . . . . . . . . . 7
4.2. Referencia de la Clase Node . . . . . . . . . . . . . . . . . . . . . . 12

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.

1.2. Código fuente


El código fuente del proyecto, además de estar adjunto, está disponible en la siguiente
dirección:
http://code.google.com/p/rg08
También está disponible el código en un repositorio de Subversion, accesible desde el
anterior enlace.
2 Método de compresión

Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
Capítulo 2

Índice de clases

2.1. Lista de clases


Lista de las clases, estructuras, uniones e interfaces con una breve descripción:
Huffman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4 Í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

3.1. Lista de archivos


Lista de todos los archivos con descripciones breves:
src/huf.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
src/huffman.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
src/huffman.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
src/node.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
src/node.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
src/qsort.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
src/qsort.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
src/types.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
src/unhuf.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
src/utils.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
src/utils.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6 Indice de archivos

Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
Capítulo 4

Documentación de las clases

4.1. Referencia de la Clase Huffman

#include <huffman.h>

Métodos públicos

Huffman (FMN origen)


void creaHuffman ()
COD generaCodigo ()
Node ∗ getTree ()

Atributos privados

vector< Node ∗ > m_vFuente

4.1.1. Descripción detallada

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

Definición en la línea 16 del archivo huffman.h.


8 Documentación de las clases

4.1.2. Documentación del constructor y destructor

4.1.2.1. Huffman::Huffman (FMN Origen)

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.

Genera un árbol por cada símbolo de la fuente de memoria nula.


Definición en la línea 13 del archivo huffman.cpp.
Hace referencia a m_vFuente.

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 }

4.1.3. Documentación de las funciones miembro

4.1.3.1. void Huffman::creaHuffman ()

Método que contruye el arbol de forma recursiva. Dentro de un vector de árboles,


seleccionamos los dos con una menor frecuencia, y los fusionamos, dando a la raiz del
nuevo arbol la frecuencia suma de las hojas:
(f1+f2) / \ (a,f1) (b,f2) => (a) (b)
Siendo f1, y f2 las menores frecuencias. Se actualiza el vector, y se realiza la llamada
recursiva. El procedimiento termina cuando solo nos queda un arbol, que corresponde
al arbol final.
Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

En primer lugar, ordenamos la fuente de memoria nula de menor frecuencia a mayor


frecuencia. Para esta ordenación usamos una implementación propia del algoritmo de
QuickSort para el caso de ordenar vecotres de árboles de codificación Huffman.

Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
4.1 Referencia de la Clase Huffman 9

Seleccionamos los dos árboles con mayor frecuencia, y los fusionamos.


Luego eliminamos los 2 primeros elementos, que ya hemos fusionado.
El algoritmo se ejecuta recursivamente hasta que sólo queden un árbol.
Definición en la línea 47 del archivo huffman.cpp.
Hace referencia a m_vFuente, y qsort().
Referenciado por comprimeFichero().

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 }

Gráfico de llamadas para esta función:

Huffman::creaHuffman qsort _quicksort particion

4.1.3.2. COD Huffman::generaCodigo ()

Método que devuelve el código Huffman generado por la clase.

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

Definición en la línea 99 del archivo huffman.cpp.


Hace referencia a Node::DTA(), y m_vFuente.
Referenciado por comprimeFichero().

99 {
100
101 Node Arbol = *m_vFuente[0];
102
103 return Arbol.DTA();
104
105 }

Gráfico de llamadas para esta función:

Huffman::generaCodigo Node::DTA Node::_DTA

4.1.3.3. Node ∗ Huffman::getTree ()

Método que devuelve el nodo raíz del árbol Huffman.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Devuelve:
Node∗ Puntero al nodo raíz.

Definición en la línea 114 del archivo huffman.cpp.


Hace referencia a m_vFuente.
Referenciado por comprimeFichero().

114 {
115 return m_vFuente[0];
116 }

4.1.4. Documentación de los datos miembro

4.1.4.1. Huffman::m_vFuente [private]

Vector de sub-árboles de codificación Huffman


Definición en la línea 24 del archivo huffman.h.
Referenciado por creaHuffman(), generaCodigo(), getTree(), y Huffman().
La documentación para esta clase fue generada a partir de los siguientes ficheros:

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

4.2. Referencia de la Clase Node

#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

stack< unsigned char > m_CodigoTemporal


string m_CodigoHoja
COD m_CodigoFinal

Atributos privados

unsigned char m_cData


bool m_bIsLeaf
double m_dProb
Node ∗ m_pLeftSon
Node ∗ m_pRightSon

Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
4.2 Referencia de la Clase Node 13

4.2.1. Descripción detallada

Clase que implementa la representación de un Nodo del árbol de codificación Huffman.


Se usan métodos para establecer y recuperar la información de los distintos atributos
del nodo.

Fecha:
Julio 2008

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Definición en la línea 19 del archivo node.h.

4.2.2. Documentación del constructor y destructor

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 }

4.2.2.2. Node::Node (unsigned char cData, double dProb)

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.

Definición en la línea 20 del archivo node.cpp.


Hace referencia a m_bIsLeaf, m_cData, m_dProb, m_pLeftSon, y m_pRightSon.

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 }

4.2.3. Documentación de las funciones miembro

4.2.3.1. Node ∗ Node::merge (Node ∗ A)

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 }

Gráfico de llamadas para esta función:

Node::getProb

Node::Node

Node::merge Node::setLeftSon

Node::setProb

Node::setRightSon

4.2.3.2. void Node::setProb (double dProb)

Establece la probabilidad del símbolo.


Definición en la línea 31 del archivo node.cpp.
Hace referencia a m_dProb.
Referenciado por merge().

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

4.2.3.3. void Node::setLeftSon (Node ∗ pA)

Establece el nodo descendiente izquierdo.

Parámetros:
← pA Puntero al nodo descendiente.

Definición en la línea 47 del archivo node.cpp.


Hace referencia a m_pLeftSon.
Referenciado por deserializaArbol(), y merge().

47 {
48 m_pLeftSon = pA;
49 }

4.2.3.4. void Node::setRightSon (Node ∗ pA)

Establece el nodo descendiente derecho.

Parámetros:
← pA Puntero al nodo descendiente.

Definición en la línea 56 del archivo node.cpp.


Hace referencia a m_pRightSon.
Referenciado por deserializaArbol(), y merge().

56 {
57 m_pRightSon = pA;
58 }

4.2.3.5. void Node::setIsLeaf (bool bIsLeaf)

Establece si el nodo es hoja o no.

Parámetros:
← bIsLeaf Booleano que establece la condición de hoja.

Definición en la línea 65 del archivo node.cpp.


Hace referencia a m_bIsLeaf.
Referenciado por deserializaArbol().

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

4.2.3.6. void Node::setData (unsigned char cData)

Establece el símbolo del nodo hoja.

Parámetros:
← cData Caracter correspondiente al símbolo a almacenar.

Definición en la línea 161 del archivo node.cpp.


Hace referencia a m_cData.
Referenciado por deserializaArbol().

161 {
162 m_cData = cData;
163 }

4.2.3.7. double Node::getProb ()

Obtiene la probabilidad del símbolo.


Definición en la línea 38 del archivo node.cpp.
Hace referencia a m_dProb.
Referenciado por merge().

38 {
39 return m_dProb;
40 }

4.2.3.8. Node ∗ Node::getLeftSon ()

Obtiene el nodo descendiente izquierdo.


Definición en la línea 72 del archivo node.cpp.
Hace referencia a m_pLeftSon.
Referenciado por decodifica(), y serializaArbol().

72 {
73 return m_pLeftSon;
74 }

4.2.3.9. Node ∗ Node::getRightSon ()

Obtiene el nodo descendiente derecho.


Definición en la línea 79 del archivo node.cpp.

Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
4.2 Referencia de la Clase Node 17

Hace referencia a m_pRightSon.


Referenciado por decodifica(), y serializaArbol().

79 {
80 return m_pRightSon;
81 }

4.2.3.10. bool Node::getIsLeaf ()

Obtiene si un nodo es hoja o no.


Definición en la línea 86 del archivo node.cpp.
Hace referencia a m_bIsLeaf.
Referenciado por decodifica(), y serializaArbol().

86 {
87 return m_bIsLeaf;
88 }

4.2.3.11. unsigned char Node::getData ()

Obtiene el símbolo asociado al nodo hoja.


Definición en la línea 93 del archivo node.cpp.
Hace referencia a m_cData.
Referenciado por decodifica(), y serializaArbol().

93 {
94 return m_cData;
95 }

4.2.3.12. COD Node::DTA ()

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

117 //cout << "[Raiz]Bajamos por la rama izquierda." << endl;


118 m_CodigoTemporal.push(’0’);
119 m_pLeftSon->_DTA(m_CodigoTemporal, this);
120 m_CodigoTemporal.pop();
121 }
122 if (m_pRightSon) {
123 m_CodigoTemporal.push(’1’);
124 m_pRightSon->_DTA(m_CodigoTemporal, this);
125 m_CodigoTemporal.pop();
126 }
127 }
128 return m_CodigoFinal;
129 }

Gráfico de llamadas para esta función:

Node::DTA Node::_DTA

4.2.3.13. void Node::_DTA (stack< unsigned char > S, Node ∗ root)

Método que recorre el árbol en profundidad.


Definición en la línea 134 del archivo node.cpp.
Hace referencia a _DTA(), m_bIsLeaf, m_cData, m_CodigoFinal, m_CodigoHoja, m_-
pLeftSon, y m_pRightSon.
Referenciado por _DTA(), y 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

Gráfico de llamadas para esta función:

Node::_DTA

4.2.4. Documentación de los datos miembro

4.2.4.1. Node::m_cData [private]

Caracter que guarda el símbolo almacenado en el nodo.


Definición en la línea 26 del archivo node.h.
Referenciado por _DTA(), getData(), Node(), y setData().

4.2.4.2. Node::m_bIsLeaf [private]

Booleano que define si un nodo es hoja o un nodo intermedio.


Definición en la línea 32 del archivo node.h.
Referenciado por _DTA(), DTA(), getIsLeaf(), Node(), y setIsLeaf().

4.2.4.3. Node::m_dProb [private]

Double que establece la probabilidad del símbolo.


Definición en la línea 38 del archivo node.h.
Referenciado por getProb(), merge(), Node(), y setProb().

4.2.4.4. Node::m_pLeftSon [private]

Puntero al nodo descendiente por la rama izquierda (Hijo 0).


Definición en la línea 44 del archivo node.h.
Referenciado por _DTA(), DTA(), getLeftSon(), Node(), y setLeftSon().

4.2.4.5. Node::m_pRightSon [private]

Puntero al nodo descendiente por la rama derecha (Hijo 1).


Definición en la línea 50 del archivo node.h.
Referenciado por _DTA(), DTA(), getRightSon(), Node(), y setRightSon().

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

Pila que almacena el código temporal obtenido al recorrer el ábol.


Definición en la línea 58 del archivo node.h.
Referenciado por DTA().

4.2.4.7. Node::m_CodigoHoja

Cadena que almacena el código obtenido al llegar a una hoja.


Definición en la línea 64 del archivo node.h.
Referenciado por _DTA().

4.2.4.8. Node::m_CodigoFinal

Cadena que almacena el código obtenido final tras recorrer el árbol.


Definición en la línea 71 del archivo node.h.
Referenciado por _DTA(), y DTA().
La documentación para esta clase fue generada a partir de los siguientes ficheros:

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

5.1. Referencia del Archivo src/huf.cpp


#include "utils.h"
Dependencia gráfica adjunta para huf.cpp:

src/huf.cpp

utils.h

types.h node.h

vector list map iostream string fstream stack

Funciones
int main (int argc, char ∗argv[ ])

5.1.1. Documentación de las funciones

5.1.1.1. int main (int argc, char ∗ argv[ ])

Definición en la línea 24 del archivo huf.cpp.


Hace referencia a comprimeFichero().

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 }

Gráfico de llamadas para esta función:

Huffman::creaHuffman qsort _quicksort particion

creaOcteto bin2char

Huffman::generaCodigo Node::DTA Node::_DTA


main comprimeFichero
Huffman::getTree
char2bin
leerFuente
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
5.2 Referencia del Archivo src/huffman.cpp 23

5.2. Referencia del Archivo src/huffman.cpp


#include "types.h"
#include "huffman.h"
#include "qsort.h"
Dependencia gráfica adjunta para huffman.cpp:

src/huffman.cpp

qsort.h huffman.h

types.h node.h

vector list map iostream string fstream stack

Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
24 Documentación de archivos

5.3. Referencia del Archivo src/huffman.h


#include "types.h"
#include "node.h"
Dependencia gráfica adjunta para huffman.h:

src/huffman.h

types.h node.h

vector list map iostream string fstream stack

Gráfico de los archivos que directa o indirectamente incluyen a este archivo:

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

5.4. Referencia del Archivo src/node.cpp


#include "types.h"
#include "node.h"
Dependencia gráfica adjunta para node.cpp:

src/node.cpp

types.h node.h

vector list map iostream string fstream stack

Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
26 Documentación de archivos

5.5. Referencia del Archivo src/node.h


Gráfico de los archivos que directa o indirectamente incluyen a este archivo:

src/node.h

src/utils.h src/huffman.h src/qsort.h src/node.cpp

src/huf.cpp src/unhuf.cpp src/utils.cpp src/huffman.cpp src/qsort.cpp

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

5.6. Referencia del Archivo src/qsort.cpp


#include "types.h"
#include "qsort.h"
Dependencia gráfica adjunta para qsort.cpp:

src/qsort.cpp

qsort.h

types.h node.h

vector list map iostream string fstream stack

Funciones
int particion (Node ∗∗frecuencias, int izquierda, int derecha)
void _quicksort (Node ∗∗frecuencias, int first, int last)
vector< Node ∗ > qsort (vector< Node ∗ > fuente)

5.6.1. Documentación de las funciones

5.6.1.1. void _quicksort (Node ∗∗ frecuencias, int first, int last)

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.

Definición en la línea 59 del archivo qsort.cpp.


Hace referencia a _quicksort(), y particion().
Referenciado por _quicksort(), y qsort().

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

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 }

Gráfico de llamadas para esta función:

_quicksort particion

5.6.1.2. int particion (Node ∗∗ frecuencias, int izquierda, int derecha)

Función particion que se usa en el algoritmo de QuickSort. Está implementado para


funcionar con vecotres de árboles de codificación Huffman.

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.

Definición en la línea 16 del archivo qsort.cpp.


Referenciado por _quicksort().

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 }

5.6.1.3. vector<Node ∗> qsort (vector< Node ∗ > fuente)

Función que encapsula la llamada al algoritmo de QuickSort.

Parámetros:
fuente Vector de punteros a nodos para ordenar.

Devuelve:
Vector ordenado.

Definición en la línea 75 del archivo qsort.cpp.


Hace referencia a _quicksort().
Referenciado por Huffman::creaHuffman().

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

Gráfico de llamadas para esta función:

qsort _quicksort particion

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

5.7. Referencia del Archivo src/qsort.h


#include "types.h"
#include "node.h"
Dependencia gráfica adjunta para qsort.h:

src/qsort.h

types.h node.h

vector list map iostream string fstream stack

Gráfico de los archivos que directa o indirectamente incluyen a este archivo:

src/qsort.h

src/huffman.cpp src/qsort.cpp

Funciones

int particion (Node ∗∗frecuencias, int izquierda, int derecha)


void _quicksort (Node ∗∗frecuencias, int first, int last)
vector< Node ∗ > qsort (vector< Node ∗ > fuente)

5.7.1. Documentación de las funciones

5.7.1.1. void _quicksort (Node ∗∗ frecuencias, int first, int last)

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

Definición en la línea 59 del archivo qsort.cpp.


Hace referencia a _quicksort(), y particion().
Referenciado por _quicksort(), y qsort().

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 }

Gráfico de llamadas para esta función:

_quicksort
_quicksort particion

5.7.1.2. int particion (Node ∗∗ frecuencias, int izquierda, int derecha)

Función particion que se usa en el algoritmo de QuickSort. Está implementado para


funcionar con vecotres de árboles de codificación Huffman.

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.

Definición en la línea 16 del archivo qsort.cpp.


Referenciado por _quicksort().

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

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 }
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 }

5.7.1.3. vector<Node ∗> qsort (vector< Node ∗ > fuente)

Función que encapsula la llamada al algoritmo de QuickSort.

Parámetros:
fuente Vector de punteros a nodos para ordenar.

Devuelve:
Vector ordenado.

Definición en la línea 75 del archivo qsort.cpp.


Hace referencia a _quicksort().
Referenciado por Huffman::creaHuffman().

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 }

Gráfico de llamadas para esta función:

qsort _quicksort particion

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

5.8. Referencia del Archivo src/types.h


#include <vector>
#include <list>
#include <map>
#include <iostream>
#include <string>
#include <fstream>
#include <stack>
Dependencia gráfica adjunta para types.h:

src/types.h

vector list map iostream string fstream stack

Gráfico de los archivos que directa o indirectamente incluyen a este archivo:

src/types.h

src/utils.h src/huffman.h src/qsort.h src/node.cpp

src/huf.cpp src/unhuf.cpp src/utils.cpp src/huffman.cpp src/qsort.cpp

Tipos definidos
typedef map< unsigned char, double > FMN
typedef map< unsigned char, string > COD

5.8.1. Documentación de los tipos definidos

5.8.1.1. COD

Mapa para la codificación: simbolo(char) -> codigo(binario)


Definición en la línea 28 del archivo types.h.

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

Definición en la línea 20 del archivo types.h.

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

5.9. Referencia del Archivo src/unhuf.cpp

#include "utils.h"
Dependencia gráfica adjunta para unhuf.cpp:

src/unhuf.cpp

utils.h

types.h node.h

vector list map iostream string fstream stack

Funciones

int main (int argc, char ∗argv[ ])

5.9.1. Documentación de las funciones

5.9.1.1. int main (int argc, char ∗ argv[ ])

Definición en la línea 3 del archivo unhuf.cpp.


Hace referencia a descomprimeFichero().

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

Gráfico de llamadas para esta función:

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

5.10. Referencia del Archivo src/utils.cpp


#include "utils.h"
#include "huffman.h"
#include "types.h"
#include <cmath>
Dependencia gráfica adjunta para utils.cpp:

src/utils.cpp

utils.h huffman.h cmath

types.h node.h

vector list map iostream string fstream stack

Funciones

unsigned char bin2char (string sSecuencia)


string char2bin (unsigned char cData)
FMN leerFuente (string sFile)
unsigned char creaOcteto (string sCodigo, int &nCeros)
void serializaArbol (string &sSecuencia, Node ∗Arbol)
void deserializaArbol (string &sSecuencia, Node ∗Arbol)
void comprimeFichero (string sFile, string sFileOut)
string leerComprimido (string sFile, int &nLenArbol)
unsigned char decodifica (string &sSecuencia, Node ∗Arbol)
void descomprimeFichero (string sFile, string sFileOut)

5.10.1. Documentación de las funciones

5.10.1.1. unsigned char bin2char (string sSecuencia)

Convierte de un binario, representado por una cadena de caracteres 0 y 1, a un unsigned


char, con la codificación correspondiente en binario real. La secuencia tiene que ser
exactamente de 8 caracteres.

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

Definición en la línea 16 del archivo utils.cpp.


Referenciado por creaOcteto(), descomprimeFichero(), y deserializaArbol().

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 }

5.10.1.2. string char2bin (unsigned char cData)

Convierte de un unsigned char a un binario, representado por una cadena de 0s y 1s,


con la codificación correspondiente en binario real.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Parámetros:
← cData Caracter a convertir a secuencia binaria.

Devuelve:
string

Definición en la línea 47 del archivo utils.cpp.


Referenciado por leerComprimido(), y serializaArbol().

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 }

5.10.1.3. void comprimeFichero (string sFile, string sFileOut)

Función que escribe en la ruta especificada, el código comprimido.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Parámetros:
← sFile Nombre del fichero fuente.
← sFileOut Nombre del fichero destino.

Definición en la línea 188 del archivo utils.cpp.


Hace referencia a Huffman::creaHuffman(), creaOcteto(), Huffman::generaCodigo(),
Huffman::getTree(), leerFuente(), y serializaArbol().
Referenciado por main().

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&eacute;s se crea el &aacute;rbol
195 * de c&oacute;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&ntilde;ade la

Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
42 Documentación de archivos

205 * extensi&oacute;n .huf al final.


206 */
207 if (sFileOut == "") {
208 sFileOut = sFile;
209 sFileOut.append(".huf");
210 }
211
212 ifstream fFuente(sFile.c_str());
213 ofstream fSalida(sFileOut.c_str(), ofstream::binary);
214
215 /*
216 * Obtenemos el &aacute;rbol serializado.
217 */
218 string bufferCodigo("");
219 serializaArbol(bufferCodigo, huf.getTree());
220
221 int nBitsArbol = static_cast<int>(bufferCodigo.size());
222 fSalida << nBitsArbol;
223
224 cout << "Tamaño del arbol(bits): " << nBitsArbol << endl;
225 cout << "Arbol serializado: " << bufferCodigo << endl;
226
227 int nCeros;
228
229 /*
230 * Almacenamos el fichero fuente en un buffer y creamos el
231 * c&oacute;digo Huffman.
232 */
233 char cCaracter;
234 unsigned char ucCaracter;
235 while (fFuente.get(cCaracter)) {
236 ucCaracter = static_cast<unsigned char>(cCaracter);
237 string sCodBinario = Codigo[ucCaracter];
238 cout << "Cod. Huffman: "<< ucCaracter << " " << sCodBinario << endl;
239 bufferCodigo.append(sCodBinario);
240 }
241 fFuente.close();
242
243 /*
244 * Creamos el fichero destino convirtiendo el buffer de Huffman octeto a
245 * octeto.
246 */
247 string sCodTmp("");
248 for (unsigned int i = 0; i < bufferCodigo.size(); i++) {
249 sCodTmp.push_back(bufferCodigo[i]);
250 if ((i+1)%8 == 0) {
251 unsigned char cCodChar = creaOcteto( sCodTmp,nCeros);
252 char buffer[1];
253 buffer[0] = static_cast<char>(cCodChar);
254 fSalida.write(buffer, 1);
255 sCodTmp = "";
256 }
257 }
258 cout << "Bits fuera de un octeto (nº menor que 8): " << sCodTmp << endl;
259 if (sCodTmp.size() != 0) {
260 unsigned char cCodChar = creaOcteto(sCodTmp, nCeros);
261 char buffer[1];
262 buffer[0] = static_cast<char>(cCodChar);
263 fSalida.write(buffer, 1);
264 unsigned char cCeros = static_cast<unsigned char>(nCeros);
265 fSalida << cCeros;
266 }

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 }

Gráfico de llamadas para esta función:

Huffman::creaHuffman qsort _quicksort particion

creaOcteto bin2char

Huffman::generaCodigo Node::DTA Node::_DTA


comprimeFichero
Huffman::getTree
char2bin
leerFuente
Node::getData

serializaArbol Node::getIsLeaf

Node::getLeftSon

Node::getRightSon

5.10.1.4. unsigned char creaOcteto (string sCodigo, int & nCeros)

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

Definición en la línea 111 del archivo utils.cpp.


Hace referencia a bin2char().
Referenciado por comprimeFichero().

111 {
112

Generado el Tue Jun 24 20:41:40 2008 para Compresor de Huffman (rg08) por Doxygen
44 Documentación de archivos

113 int nLongitud = sCodigo.size();


114 nCeros = 0;
115 if (nLongitud < 8) {
116 for (unsigned int i = sCodigo.size(); i < 8; i++ ) {
117 sCodigo.push_back(’0’);
118 nCeros++;
119 }
120 cout << "Byte de relleno: " << sCodigo << endl;
121 }
122 return bin2char(sCodigo);
123 }

Gráfico de llamadas para esta función:

creaOcteto bin2char

5.10.1.5. unsigned char decodifica (string & sSecuencia, Node ∗ Arbol)

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

Definición en la línea 310 del archivo utils.cpp.


Hace referencia a decodifica(), Node::getData(), Node::getIsLeaf(),
Node::getLeftSon(), y Node::getRightSon().
Referenciado por decodifica(), y descomprimeFichero().

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

321 return decodifica(sSecuencia, Arbol->getLeftSon());


322 }
323 }
324 return ’\0’;
325 }

Gráfico de llamadas para esta función:

Node::getData

Node::getIsLeaf
decodifica
Node::getLeftSon

Node::getRightSon

5.10.1.6. void descomprimeFichero (string sFile, string sFileOut)

Función que descomprime un fichero comprimido.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Parámetros:
← sFile Nombre del fichero comprimido.
← sFileOut Nombre del fichero de salida.

Definición en la línea 335 del archivo utils.cpp.


Hace referencia a bin2char(), decodifica(), deserializaArbol(), y leerComprimido().
Referenciado por main().

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&oacute;digo asociado al &aacute;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&iacute;dos los datos, decodificamos mediante el &aacute;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

Gráfico de llamadas para esta función:

bin2char

Node::setData

Node::setIsLeaf

deserializaArbol
Node::setLeftSon

Node::setRightSon
descomprimeFichero

Node::getData

decodifica Node::getIsLeaf

Node::getLeftSon

leerComprimido Node::getRightSon

char2bin

5.10.1.7. void deserializaArbol (string & sSecuencia, Node ∗ Arbol)

Función que deserializa un árbol.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Parámetros:
← Arbol Puntero al árbol deserializado.
→ sSecuencia Árbol serializado.

Definición en la línea 158 del archivo utils.cpp.


Hace referencia a bin2char(), deserializaArbol(), Node::setData(), Node::setIsLeaf(),
Node::setLeftSon(), y Node::setRightSon().
Referenciado por descomprimeFichero(), y deserializaArbol().

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

168 Node *nuevoIzquierdo = new Node();


169 Arbol->setLeftSon(nuevoIzquierdo);
170 deserializaArbol(sSecuencia, nuevoIzquierdo);
171 Node *nuevoDerecho = new Node();
172 Arbol->setRightSon(nuevoDerecho);
173 deserializaArbol(sSecuencia, nuevoDerecho);
174 }
175
176 }

Gráfico de llamadas para esta función:

bin2char

Node::setData

deserializaArbol Node::setIsLeaf

Node::setLeftSon

Node::setRightSon

5.10.1.8. string leerComprimido (string sFile, int & nLenArbol)

Función que lee un fichero comprimido.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Parámetros:
← sFile Nombre del fichero fuente.
→ nLenArbol Número de bits del árbol;

Definición en la línea 280 del archivo utils.cpp.


Hace referencia a char2bin().
Referenciado por descomprimeFichero().

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

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 }

Gráfico de llamadas para esta función:

leerComprimido char2bin

5.10.1.9. FMN leerFuente (string sFile)

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.

Definición en la línea 74 del archivo utils.cpp.


Referenciado por comprimeFichero().

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

92 caracterFrecuencia[it->first] = it->second / unTam;


93 }
94
95 file.close();
96 return caracterFrecuencia;
97 }

5.10.1.10. void serializaArbol (string & sSecuencia, Node ∗ Arbol)

Función que serializa un árbol.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Parámetros:
← Arbol Puntero al árbol a serializar.

→ sSecuencia Árbol serializado.

Definición en la línea 133 del archivo utils.cpp.


Hace referencia a char2bin(), Node::getData(), Node::getIsLeaf(), Node::getLeftSon(),
Node::getRightSon(), y serializaArbol().
Referenciado por comprimeFichero(), y serializaArbol().

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

Gráfico de llamadas para esta función:

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

5.11. Referencia del Archivo src/utils.h


#include "types.h"
#include "node.h"
Dependencia gráfica adjunta para utils.h:

src/utils.h

types.h node.h

vector list map iostream string fstream stack

Gráfico de los archivos que directa o indirectamente incluyen a este archivo:

src/utils.h

src/huf.cpp src/unhuf.cpp src/utils.cpp

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)

5.11.1. Documentación de las funciones

5.11.1.1. unsigned char bin2char (string sSecuencia)

Convierte de un binario, representado por una cadena de caracteres 0 y 1, a un unsigned


char, con la codificación correspondiente en binario real. La secuencia tiene que ser
exactamente de 8 caracteres.

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

Definición en la línea 16 del archivo utils.cpp.


Referenciado por creaOcteto(), descomprimeFichero(), y deserializaArbol().

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 }

5.11.1.2. string char2bin (unsigned char cData)

Convierte de un unsigned char a un binario, representado por una cadena de 0s y 1s,


con la codificación correspondiente en binario real.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Parámetros:
← cData Caracter a convertir a secuencia binaria.

Devuelve:
string

Definición en la línea 47 del archivo utils.cpp.


Referenciado por leerComprimido(), y serializaArbol().

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 }

5.11.1.3. void comprimeFichero (string sFile, string sFileOut)

Función que escribe en la ruta especificada, el código comprimido.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Parámetros:
← sFile Nombre del fichero fuente.
← sFileOut Nombre del fichero destino.

Definición en la línea 188 del archivo utils.cpp.


Hace referencia a Huffman::creaHuffman(), creaOcteto(), Huffman::generaCodigo(),
Huffman::getTree(), leerFuente(), y serializaArbol().
Referenciado por main().

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&eacute;s se crea el &aacute;rbol
195 * de c&oacute;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&ntilde;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

205 * extensi&oacute;n .huf al final.


206 */
207 if (sFileOut == "") {
208 sFileOut = sFile;
209 sFileOut.append(".huf");
210 }
211
212 ifstream fFuente(sFile.c_str());
213 ofstream fSalida(sFileOut.c_str(), ofstream::binary);
214
215 /*
216 * Obtenemos el &aacute;rbol serializado.
217 */
218 string bufferCodigo("");
219 serializaArbol(bufferCodigo, huf.getTree());
220
221 int nBitsArbol = static_cast<int>(bufferCodigo.size());
222 fSalida << nBitsArbol;
223
224 cout << "Tamaño del arbol(bits): " << nBitsArbol << endl;
225 cout << "Arbol serializado: " << bufferCodigo << endl;
226
227 int nCeros;
228
229 /*
230 * Almacenamos el fichero fuente en un buffer y creamos el
231 * c&oacute;digo Huffman.
232 */
233 char cCaracter;
234 unsigned char ucCaracter;
235 while (fFuente.get(cCaracter)) {
236 ucCaracter = static_cast<unsigned char>(cCaracter);
237 string sCodBinario = Codigo[ucCaracter];
238 cout << "Cod. Huffman: "<< ucCaracter << " " << sCodBinario << endl;
239 bufferCodigo.append(sCodBinario);
240 }
241 fFuente.close();
242
243 /*
244 * Creamos el fichero destino convirtiendo el buffer de Huffman octeto a
245 * octeto.
246 */
247 string sCodTmp("");
248 for (unsigned int i = 0; i < bufferCodigo.size(); i++) {
249 sCodTmp.push_back(bufferCodigo[i]);
250 if ((i+1)%8 == 0) {
251 unsigned char cCodChar = creaOcteto( sCodTmp,nCeros);
252 char buffer[1];
253 buffer[0] = static_cast<char>(cCodChar);
254 fSalida.write(buffer, 1);
255 sCodTmp = "";
256 }
257 }
258 cout << "Bits fuera de un octeto (nº menor que 8): " << sCodTmp << endl;
259 if (sCodTmp.size() != 0) {
260 unsigned char cCodChar = creaOcteto(sCodTmp, nCeros);
261 char buffer[1];
262 buffer[0] = static_cast<char>(cCodChar);
263 fSalida.write(buffer, 1);
264 unsigned char cCeros = static_cast<unsigned char>(nCeros);
265 fSalida << cCeros;
266 }

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 }

Gráfico de llamadas para esta función:

Huffman::creaHuffman qsort _quicksort particion

creaOcteto bin2char

Huffman::generaCodigo Node::DTA Node::_DTA


comprimeFichero
Huffman::getTree
char2bin
leerFuente
Node::getData

serializaArbol Node::getIsLeaf

Node::getLeftSon

Node::getRightSon

5.11.1.4. unsigned char creaOcteto (string sCodigo, int & nCeros)

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

Definición en la línea 111 del archivo utils.cpp.


Hace referencia a bin2char().
Referenciado por comprimeFichero().

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

113 int nLongitud = sCodigo.size();


114 nCeros = 0;
115 if (nLongitud < 8) {
116 for (unsigned int i = sCodigo.size(); i < 8; i++ ) {
117 sCodigo.push_back(’0’);
118 nCeros++;
119 }
120 cout << "Byte de relleno: " << sCodigo << endl;
121 }
122 return bin2char(sCodigo);
123 }

Gráfico de llamadas para esta función:

creaOcteto bin2char

5.11.1.5. unsigned char decodifica (string & sSecuencia, Node ∗ Arbol)

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

Definición en la línea 310 del archivo utils.cpp.


Hace referencia a decodifica(), Node::getData(), Node::getIsLeaf(),
Node::getLeftSon(), y Node::getRightSon().
Referenciado por decodifica(), y descomprimeFichero().

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

321 return decodifica(sSecuencia, Arbol->getLeftSon());


322 }
323 }
324 return ’\0’;
325 }

Gráfico de llamadas para esta función:

Node::getData

Node::getIsLeaf
decodifica decodifica

Node::getLeftSon

Node::getRightSon

5.11.1.6. void descomprimeFichero (string sFile, string sFileOut)

Función que descomprime un fichero comprimido.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Parámetros:
← sFile Nombre del fichero comprimido.
← sFileOut Nombre del fichero de salida.

Definición en la línea 335 del archivo utils.cpp.


Hace referencia a bin2char(), decodifica(), deserializaArbol(), y leerComprimido().
Referenciado por main().

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

350 Node *Arbol = new Node();


351 string subSecuencia = bufferComprimido.substr(0, nLenArbol);
352 cout << "Arbol serializado: " << subSecuencia << endl;
353
354 /*
355 * Tras obtener el c&oacute;digo asociado al &aacute;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() - nLenArbol);
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&iacute;dos los datos, decodificamos mediante el &aacute;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
60 Documentación de archivos

Gráfico de llamadas para esta función:

bin2char

Node::setData

Node::setIsLeaf

deserializaArbol
Node::setLeftSon

Node::setRightSon
descomprimeFichero

Node::getData

decodifica Node::getIsLeaf

Node::getLeftSon

leerComprimido Node::getRightSon

char2bin

5.11.1.7. void deserializaArbol (string & sSecuencia, Node ∗ Arbol)

Función que deserializa un árbol.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Parámetros:
← Arbol Puntero al árbol deserializado.
→ sSecuencia Árbol serializado.

Definición en la línea 158 del archivo utils.cpp.


Hace referencia a bin2char(), deserializaArbol(), Node::setData(), Node::setIsLeaf(),
Node::setLeftSon(), y Node::setRightSon().
Referenciado por descomprimeFichero(), y deserializaArbol().

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

168 Node *nuevoIzquierdo = new Node();


169 Arbol->setLeftSon(nuevoIzquierdo);
170 deserializaArbol(sSecuencia, nuevoIzquierdo);
171 Node *nuevoDerecho = new Node();
172 Arbol->setRightSon(nuevoDerecho);
173 deserializaArbol(sSecuencia, nuevoDerecho);
174 }
175
176 }

Gráfico de llamadas para esta función:

bin2char

Node::setData
deserializaArbol
deserializaArbol
Node::setIsLeaf

Node::setLeftSon

Node::setRightSon

5.11.1.8. string leerComprimido (string sFile, int & nLenArbol)

Función que lee un fichero comprimido.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Parámetros:
← sFile Nombre del fichero fuente.
→ nLenArbol Número de bits del árbol;

Definición en la línea 280 del archivo utils.cpp.


Hace referencia a char2bin().
Referenciado por descomprimeFichero().

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 }

Gráfico de llamadas para esta función:

leerComprimido char2bin

5.11.1.9. FMN leerFuente (string sFile)

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.

Definición en la línea 74 del archivo utils.cpp.


Referenciado por comprimeFichero().

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

90 unsigned int unTam = caracterFrecuencia.size();


91 for (it = caracterFrecuencia.begin(); it != caracterFrecuencia.end(); it++) {
92 caracterFrecuencia[it->first] = it->second / unTam;
93 }
94
95 file.close();
96 return caracterFrecuencia;
97 }

5.11.1.10. void serializaArbol (string & sSecuencia, Node ∗ Arbol)

Función que serializa un árbol.

Autor:
Iván Rodríguez Sastre
Marcos Gabarda Inat

Parámetros:
← Arbol Puntero al árbol a serializar.

→ sSecuencia Árbol serializado.

Definición en la línea 133 del archivo utils.cpp.


Hace referencia a char2bin(), Node::getData(), Node::getIsLeaf(), Node::getLeftSon(),
Node::getRightSon(), y serializaArbol().
Referenciado por comprimeFichero(), y serializaArbol().

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

Gráfico de llamadas para esta función:

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