Szyfr budzikowy utajnia informację łącząc każdą kolejną parę i zapisując je pod postacią budzika z godziną. Każdy znak z alfabetu łacińskiego ma odpowiadający mu dwucyfrowy kod. Numerowanie zaczynamy od 00, a nie od 01:
Litera | A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Odpowiednik | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
Litera | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Odpowiednik | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
Znak specjalny | (spacja) | \0 |
---|---|---|
Odpowiednik | 58 | 59 |
Szyfrując wybieramy parę jeszcze nie zaszyfrowanych liter. Zapiszemy je w postaci budzika. Budzik ma postać [AB:CD], gdzie za A wstawiamy pierwszą cyfrę z odpowiednika pierwszej litery w parze, a za C drugą. Analogicznie zastępujemy B i D dla drugiej litery w parze. Jednak może się zdarzyć, że uzyskamy godzinę nierealną - w takim przypadku z pary szyfrujemy wtedy tylko pierwszą literę. Wtedy za AB wpisujemy 23, a za CD wstawiamy kod szyfrowanej litery. W ten sam sposób szyfrujemy literę, która nie będzie miała pary.
Przykładowo wyraz SZYFR BUDZIK zaszyfrujemy następująco:
Przed przystąpieniem do zadania warto dopisać kilka pomocniczych funkcji, które będą ułatwiać pisanie kodu. Pierwsza z funkcji będzie nazywać się charToValue() i będzie przyjmować argument c - pojedynczą literę. Wynikiem będzie Odpowiednik dla podanej litery:
Przyda się również funkcja odwrotna do podanej. Na podstawie wartości Odpowiednika zostanie zwrócony odpowiedni znak:
Szyfr znacząco polega na wybieraniu k-tej cyfry z liczby. Na potrzeby programu można napisać uproszczoną wersję funkcji. Przyjmować będzie argumenty a - liczba z której chcemy pobrać cyfrę oraz k - określi którą cyfrę od prawej strony:
Ostatnia funkcja sprawdzi czy podany czas jest prawidłowy czy nie:
Po napisaniu funkcji pomocniczej można przejść do właściwej funkcji szyfrującej:
Przed przystąpieniem do właściwego szyfrowania najpierw policzymy ile bajtów musimy zaalokować. W tym celu (2.) inicjalizujemy licznik dl na 0. (3.) Dla każdego znaku w podanym wyrażeniu: (4., 5.) obliczamy wartości numeryczne dla pierwszych dwóch niezaszyfrowanych znaków. (6.) Zwiększamy długość. (7.) Sprawdzamy czy możemy je zapisać razem. Jeśli tak to (8.) zwiększamy j o 2. W ten sposób "oznaczymy", że dane o mniejszym indeksie już są zaszyfrowane. (9.) Ze względu na możliwą nieparzystość długości data sprawdzamy czy nie pominęliśmy znaku \0. Jednak jeśli znaków nie możemy zapisać razem to (11.) zwiększamy j o 1.
(14.) Znając długość tekstu wynikowego alokujemy tablicę wynikową. (15.) Rozpoczynamy pętle, która zaszyfruje każdy znak po kolei. Zmienna i będzie przechowywać w której grupie wyniku zapisujemy, a j - indeks ostatniego niezaszyfrowanego znaku. (16., 17.) Pobieramy Odpowiedniki pierwszych dwóch niezaszyfrowanych wyrazów. (18. - 20.) Dopisujemy na odpowiednich pozycjach odpowiednie znaki "budzika". (21.) Sprawdzamy czy możemy zapisać obydwa znaki razem. Jeśli tak to (22. - 25.) przepisujemy na odpowiednie pozycje cyfry obu liczb. (26.) Sprawdzamy czy nie powinniśmy przerwać wykonywania. Jednak jeśli nie możemy zapisać rozpatrywanej pary liczb (l1, l2) to (28. - 31.) dopisujemy 23 i cyfry pierwszej liczby. (32.) Zmniejszamy j o 1, ponieważ zapisaliśmy tylko jeden znak, a nie dwa jak to jest założone na początku pętli for. (35.) Na koniec dopisujemy znak końca danych i (36) zwracamy wynik.
Deszyfrowanie tekstu jest nieco prostsze, ponieważ wystarczy pogrupować znaki po 7 i odpowiednio je zinterpretować:
(2. - 5.) Na początek wyliczamy długość tekstu wynikowego. Warto tu pamiętać, że jeśli godzina to 23 to w bloku zaszyfrowany jest tylko jeden znak. W przeciwnym 2 znaki.
(6.) Alokujemy pamięć pod wynik. (7.) Dla każdego znaku w tekście: (8. - 11.) wyliczamy wartości a, b, c, d. (12.) Jeśli zestawienie ab = 23 to (13.) dopisujemy jeden znak złożony z cd. W przeciwnym wypadku dopisujemy dwa znaki: (15.) złożony z wartości a i c oraz (16.) b i d. (19.) Dopisujemy znak końca danych i (20.) zwracamy wynik.
Poniższa funkcja main() pozwoli przetestować napisane funkcje.
Przykładowo po wpisaniu tekstu INFORMACJA otrzymamy: