Песни о Паскале | страница 85
Итак, научившись превращать числа в символы и наоборот, мы оказались в шаге от поставленной цели – шифрования символа.
Вернемся к функции шифрования Encrypt, теперь мы можем упростить её до предела.
>function Encrypt(arg: char): char;
>begin
> Crypt:= Char(Ord(arg) + CKey);
>end;
Здесь CKey – ключ шифра, хранящийся где-то в глобальной константе или переменной. Превратив символ arg в число, мы прибавляем к нему ключ, а полученную сумму вновь превращаем в символ.
Все хорошо, прекрасная маркиза, за исключеньем пустяка: сумма в скобках может оказаться больше 255, а символа с таким кодом не существует! Как тогда поступит функция Char? Она вернет символ, укоротив его код на 256. Например, функция Char(260) вернет символ с кодом 260–256=4. Устроит нас это? Никак нет, поскольку первые 32 символа таблицы (коды от 0 до 31) – это управляющие символы. К сожалению, такие символы нарушат структуру текстового файла, и редактор не сможет прочесть его.
Значит, при передаче суммы в функцию Char надо проверить, не превышает ли она 255? Если да, то обрубим ей «хвост» и сдвинем ещё на 32 позиции выше, чтобы попасть в область видимых символов с кодами от 32 и далее.
>if X>255 then X:=X–256+32; { смещаем «хвост» – в начало видимых символов }
Так получаем окончательный вариант функции шифрования символа.
>function Encrypt(arg: char): char;
>var x: integer;
>begin
> x:= Ord(arg)+ CKey;
> if x>255 then x:= x–256+32;
> Crypt:= Char(x);
>end;
Понятно, что для расшифровки символа надо выполнить обратный сдвиг. После вычитания ключа проверим, не попадает ли полученная разность в область управляющих символов? Если попадает, поправим её, сместив в область видимых символов. Вот текст функции расшифровки Decrypt.
>function Decrypt(arg: char): char;
>var x: integer;
>begin
> x:= Ord(arg)– CKey;
> if x<32 then x:= x+256–32;
> Decrypt:= Char(x);
>end;
Теперь все готово для построения программы шифрования и расшифровки строки «P_24_1».
>{ P_24_1 – Шифрование строки}
>const CKey = 2; { Ключ Цезаря }
>{––––– Шифрование одного символа –––––}
>function Encrypt(arg: char): char;
>var x: integer;
>begin
> x:= Ord(arg)+ CKey;
> if x>255 then x:= x–256+32;
> Encrypt:= Char(x);
>end;
>{––––– Расшифровка одного символа –––––}
>function Decrypt(arg: char): char;
>var x: integer;
>begin
> x:= Ord(arg)– CKey;
> if x<32 then x:= x+256–32;
> Decrypt:= Char(x);
>end;
>{––––– Шифрование строки –––––}