Uma implementação completa do algoritmo de compressão de Huffman em linguagem C, incluindo interface interativa com menu para compactação e descompactação de arquivos.
Este projeto implementa o algoritmo de codificação de Huffman para compressão de dados. O algoritmo utiliza uma árvore binária para gerar códigos de tamanho variável baseados na frequência dos caracteres, resultando em compressão eficiente de arquivos de qualquer tipo.
- ✅ Árvore de Huffman dinâmica: Construída baseada na frequência dos caracteres do arquivo
- ✅ Interface interativa: Menu intuitivo para facilitar o uso
- ✅ Preservação de extensões: Mantém a extensão original após descompressão
- ✅ Suporte a arquivos binários: Funciona com qualquer tipo de arquivo (.txt, .jpeg, .pdf, etc.)
- ✅ Relatório: Mostra estatísticas de compressão e caminhos dos arquivos
- ✅ Formato proprietário .pcb: Arquivos comprimidos salvos com extensão personalizada
gcc -o huffman main.c huffman.c codigo.c -Wall -Wextra -std=c99./huffman- Execute o programa:
./huffman - Escolha a opção
1(Comprimir arquivo) - Digite o diretório do arquivo:
C:/Users/SeuNome/Desktop/testes - Digite o nome do arquivo com extensão:
documento.txt - O arquivo comprimido será salvo como
documento.pcbno mesmo diretório
- Execute o programa:
./huffman - Escolha a opção
2(Descomprimir arquivo) - Digite o caminho completo do arquivo .pcb:
C:/Users/SeuNome/Desktop/testes/documento.pcb - O arquivo será descomprimido como
decomprimido_documento.txt(preservando a extensão original)
- Windows:
C:/Users/Nome/Desktop/arquivo.txt - macOS/Linux:
/Users/nome/Desktop/arquivo.txt
O formato proprietário .pcb utiliza um cabeçalho estruturado:
HUFFv2|EXT=txt|TREE=[árvore_serializada]|ENDTREE|[tamanho_original][dados_comprimidos]
- Análise de Frequência: Conta a ocorrência de cada byte no arquivo
- Construção da Árvore: Constrói árvore de Huffman usando fila de prioridade
- Geração de Códigos: Percorre a árvore para criar códigos únicos
- Serialização: Salva árvore e metadados no cabeçalho
- Codificação: Substitui bytes originais pelos códigos Huffman
- Leitura do Cabeçalho: Extrai metadados e árvore serializada
- Reconstrução da Árvore: Reconstrói árvore de Huffman
- Decodificação: Navega pela árvore para recuperar bytes originais
- Restauração: Salva arquivo com nome e extensão originais
| Tipo de Arquivo | Tamanho Original | Tamanho Compactado | Taxa de Compressão |
|---|---|---|---|
| Texto comum (.txt) | 100 KB | 58 KB | 42% |
| Código fonte (.c) | 50 KB | 31 KB | 38% |
| Imagem (.jpeg) | 2.5 MB | 2.1 MB | 16% |
| Dados repetitivos | 200 KB | 45 KB | 77.5% |
- Compilador: GCC (ou qualquer compilador C compatível com C99)
- Sistema operacional: Linux, macOS, Windows
- Memória: Mínimo 1MB disponível
- Espaço em disco: Espaço suficiente para arquivos originais + comprimidos
O formato proprietário .pcb (Projeto Compressor Binário) contém:
[Cabeçalho] HUFFv2|EXT=extensao|TREE=dados_arvore|ENDTREE|
[Metadados] tamanho_original (8 bytes)
[Dados] bits_comprimidos
# 1. Compilar o programa
gcc -o huffman main.c huffman.c codigo.c -Wall -Wextra -std=c99
# 2. Executar
./huffman
# 3. Testar compressão (opção 1)
# Diretório: /caminho/para/seus/testes
# Arquivo: teste.txt
# 4. Testar descompressão (opção 2)
# Arquivo: /caminho/para/seus/testes/teste.pcb
# 5. Verificar integridade
diff teste.txt decomprimido_teste.txt- Arquivo de texto:
exemplo.txt - Imagem:
foto.jpeg - Documento:
relatorio.pdf - Código fonte:
programa.c
Todos os tipos são suportados e preservam suas extensões após descompressão.
O algoritmo de Huffman é um método de compressão sem perdas que utiliza códigos de tamanho variável. Os caracteres mais frequentes recebem códigos mais curtos, enquanto os menos frequentes recebem códigos mais longos.
- Contagem de frequência: Conta a ocorrência de cada caractere
- Criação de nós folha: Cada caractere vira um nó com sua frequência
- Construção da árvore: Combina os dois nós de menor frequência repetidamente
- Geração de códigos: Percorre a árvore para gerar códigos binários
- Codificação: Substitui caracteres pelos códigos correspondentes
- Arquivos muito pequenos (< 100 bytes) podem ter compressão ineficiente
- Arquivos já comprimidos (.zip, .rar) terão baixa taxa de compressão
- Caminhos muito longos (> 512 caracteres) podem causar problemas
- Interface apenas em português
- Huffman Coding - Wikipedia
- Introduction to Algorithms - CLRS
- Data Structures and Algorithm Analysis in C
⭐ Se este projeto foi útil para você, considere dar uma estrela!