Skip to content

Commit 0aba440

Browse files
committed
Atualizado README e enviado arquivos de teste
1 parent fae194b commit 0aba440

File tree

4 files changed

+3675
-2
lines changed

4 files changed

+3675
-2
lines changed

README.md

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,65 @@
1-
# java-encoder-decoder
1+
# Java Encoder Decoder
2+
Simples programa que dispõe de vários métodos de codificação e decodificação, além de rotinas para o tratamento de erro usando Hamming e CRC.
3+
4+
![Janela principal do programa](https://i.imgur.com/uQEr9PF.png)
5+
6+
O programa é capaz de manipular um arquivo e operar nas seguintes funcionalidades:
7+
**Codificação:** Arquivo.txt -> Arquivo.enc
8+
**Decodificação:** Arquivo.enc -> Arquivo.dec
9+
**Tratamento de erro:** Arquivo.enc -> Arquivo.enc.ecc -> Arquivo.enc
10+
11+
## Implementando um enconder
12+
A classe `Encoder` possui dois contratos responsáveis pela codificação e decodificação de uma entrada de dados.
13+
14+
Tanto o método de codificação quanto o de decodificação recebem dois argumentos, sendo o primeiro a stream de dados do arquivo original e o segundo a stream de saída do arquivo processado.
15+
```java
16+
public interface Encoder {
17+
public void encode(InputStream reader, OutputStream writer) throws IOException;
18+
public void decode(InputStream reader, OutputStream writer) throws IOException;
19+
}
20+
```
21+
## Leitura e escrita bit-a-bit
22+
Para facilitar a leitura e geração dos codewords são disponibilizadas duas classes para a manipulação de streams de dados a nivel de bit.
23+
24+
A classe `InputBitStream` permite a leitura de uma quantidade específica de bits, facilitando o parsing do arquivo codificado.
25+
```java
26+
// Decodificacao unaria
27+
InputBitStream bstream = new InputBitStream(reader);
28+
while(bstream.hasNext()) {
29+
int symbol = (int) bstream.countWhile(false);
30+
if (!bstream.isNextBitSet()) break;
31+
bstream.nextBit(); // Stop bit
32+
writer.write(symbol);
33+
}
34+
```
35+
A classe `OutputBitStream` permite a escrita de uma quantidade específica de bits, facilitando a escrita dos codewords gerados pelo algoritmo de compressão.
36+
*OBS.: Internamente, a classe usa um buffer do tamanho de um byte que é escrito no output assim que estiver cheio, por isso é recomendável chamar o método `flush` ao final do processamento para garantir assim, a escrita dos bits remanescentes no buffer.*
37+
```java
38+
// Codificacao unaria
39+
OutputBitStream bstream = new OutputBitStream(writer);
40+
int symbol = reader.read();
41+
while (symbol != -1) {
42+
bstream.writeBits(false, symbol);
43+
bstream.writeBit(true); // Stop bit
44+
symbol = reader.read();
45+
}
46+
bstream.flush(); // Esvazia o buffer
47+
```
48+
## Codificações suportadas
49+
As seguintes codificações foram implementadas e estão disponíveis no programa:
50+
51+
- [x] Delta
52+
- [x] Elias-Gamma
53+
- [x] Fibonacci
54+
- [x] Golomb
55+
- [x] Unária
56+
57+
## Tratamento de erros
58+
![Opções para tratamento de erro](https://i.imgur.com/CBucu5Z.png)
59+
60+
O programa possui a função de gerar um arquivo `.ecc` para o tratamento de erros. Esse arquivo e codificado utilizando **Hamming** permitindo corrigir automaticamente os bits inconsistentes durante a decodificação.
61+
62+
Só é possível gerar arquivos de tratamento de erros para arquivos que foram codificados pelo programa (`.enc`), uma vez que o cabeçalho do arquivo codificado é preservado no arquivo de tratamento de erros. Esse cabeçalho é processado por uma divisão polinomial **CRC** que gera um byte de verificação, o qual é concatenado logo após o cabeçalho.
63+
64+
### Log de inconsistências
65+
Qualquer inconsistência detectada durante o processo de tratamento de erros será registrado em um arquivo de log armazenado na pasta do executável.

0 commit comments

Comments
 (0)