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