beale.c
: arquivo principal do programa, contém a funçãomain()
.encode.c
: contém a funçãoencodeByBook()
, que codifica uma mensagem a partir de um livro usando a cifra de Beale.decode.c
: contém a funçãodecodeByBook()
, que decodifica uma mensagem a partir de um livro usando a cifra de Beale. Além disso, contém a funçãodecodeByKeys()
, que decodifica uma mensagem a partir de um arquivo de chaves usando a cifra de Beale.utils.c
: contém as definições de funções auxiliares usadas emencode.c
edecode.c
.arrIdxToChar()
echarToArrIdx()
são funções auxiliares para a conversão de índices de arrays para caracteres e vice-versa.linkedlist.c
: contém as definições de funções auxiliares para a implementação de uma lista encadeada, usada para armazenar as chaves de decodificação. Ou seja, contém as definições de funções para criar, inserir, remover, imprimir em um arquivo e liberar uma lista encadeada.
encode.h
: contém as definições de funções e estruturas de dados usadas emencode.c
.decode.h
: contém as definições de funções e estruturas de dados usadas emdecode.c
.utils.h
: contém as definições de funções e estruturas de dados usadas emutils.c
.linkedlist.h
: contém as definições de funções e estruturas de dados usadas emlinkedlist.c
.
A estrutura de dados escolhida para armazenar as chaves de decodificação foi uma lista encadeada, pois a inserção de uma chave na lista é feita em tempo constante, pois há um ponteiro para o final da lista. Além disso, a lista encadeada é bem simples de ser implementada, e não há um limite para o número de elementos que podem ser armazenados na lista e, principalmente, permite a separação de blocos de memória.
-
Ler o livro e armazenar em uma lista de tamanho fixo dos caractéres ASCII imprimíveis (32 a 126). Cada elemento é uma lista encadeada de chaves de cada caractere. Ou seja, a lista de tamanho fixo é um array de listas encadeadas.
-
Para cada caractere da mensagem original, escolher uma chave aleatória da lista de chaves do caractere correspondente no livro.
-
Escrever as chaves escolhidas em um arquivo de chaves.
-
Escrever a mensagem codificada em um arquivo.
- Ler o arquivo de chaves e armazenar em uma string de tamanho dinâmico, tal caractere na posição cada chave. Ex.:
a: 0 1 5 3
b: 2 4 6
Será armazenado como a string "aababab"
. Assim, cada caractere da string é uma
chave de decodificação, isso permite que a decodificação seja feita em tempo constante.
- Utilizando a string de chaves, decodificar a mensagem codificada e escrever em um arquivo (-1 sendo espaço em branco e -2 uma nova linha). Ex.:
0 -1 2 -2 0 1 5 6
Com a string de chaves "aababab"
, será decodificado como:
a b
aab
- Escrever a mensagem decodificada em um arquivo.
- Ler o livro e armazenar em uma string de tamanho dinâmico, tal caractere na posição cada chave. Ex.:
Era uma vez um rei que tinha um filho muito esperto. Um dia, o rei perguntou ao filho:
Será armazenado como a string "EuvurqtufmeUdorpaf"
. Caracteres especiais são ignorados.
- Repetir o processos 2 e 3 do algoritmo
decodeByKeys()
.
make
: compila o programa.make test
: executa o programa de teste (codifica e decodifica das 2 maneiras)make check
: verifica se a mensagem original coincide com ambos os arquivos decodificados (de maneira diferente) pela codificação.make clean
: limpa os arquivos.o
gerados pela compilação.make purge
: limpa todos os arquivos gerados pela compilação e os arquivos de teste.
Marcelo Augusto Rissette Schreiber - GRR20220063