Вход/Регистрация
Интернет решения от доктора Боба
вернуться

Swart Bob

Шрифт:

Заметим что если для UUEncodeиспользуется подмножество набора символов ASCII (32..96), то для XXEncode это не так.

Для преобразования процедур Triplet2Kwartet и Kwartet2Triplet для поддержки мы вводим дополнительный массив из 64 символов.

Нам также необходимо модифицировать процедуры Triplet2Kwartet и Kwartet2Triplet следующим образом.

const

XX: Array[0..63] of Char =

'+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

 procedure Triplet2Kwartet(const Triplet: TTriplet; var Kwartet: TKwartet);

 var

i: Integer;

 begin

Kwartet[0] := (Triplet[0] SHR 2);

Kwartet[1] := ((Triplet[0] SHL 4) AND $30) +

((Triplet[1] SHR 4) AND $0F);

Kwartet[2] := ((Triplet[1] SHL 2) AND $3C) +

((Triplet[2] SHR 6) AND $03);

Kwartet[3] := (Triplet[2] AND $3F);

for i:=0 to 3 do

if Kwartet[i] = 0 then Kwartet[i] := $40 + Ord(SP)

else Inc(Kwartet[i],Ord(SP));

if XXCode then

for i:=0 to 3 do Kwartet[i] := Ord(XX[(Kwartet[i] - Ord(SP)) mod $40])

 end {Triplet2Kwartet};

Последние несколько строк новые для процедуры Triplet2Kwartet и мы используем набор символов XXencode для возврата правильно закодированных символов. Помните, что UUEncode возвращает индекс кодированного символа, после чего мы к нему добавляем код #32, так что если XXencode используется после преобразования в UUEncode, то мы должны вычесть 32 и использовать результат как индекс в таблицу символов XXencode.

То же самое относится и к процедуре Kwartet2Triplet, где мы должны преобразовать XXencode символы перед использованием алгоритма UUdecode (заметим, что мы теперь не передаем Kwartet как const).

procedure Kwartet2Triplet(Kwartet: TKwartet; var Triplet: TTriplet);

 var

i: Integer;

 begin

if XXCode then

begin

for i:=0 to 3 do

begin

case Chr(Kwartet[i]) of

'+': Kwartet[i] := 0 + Ord(SP);

'-': Kwartet[i] := 1 + Ord(SP);

'0'..'9': Kwartet[i] := 2 + Kwartet[i]

– Ord('0') + Ord(SP);

'A'..'Z': Kwartet[i] := 12 + Kwartet[i]

– Ord('A') + Ord(SP);

'a'..'z': Kwartet[i] := 38 + Kwartet[i]

– Ord('a') + Ord(SP)

end

end

end;

Triplet[0] := ((Kwartet[0] - Ord(SP)) SHL 2) +

(((Kwartet[1] - Ord(SP)) AND $30) SHR 4);

Triplet[1] := (((Kwartet[1] - Ord(SP)) AND $0F) SHL 4) +

(((Kwartet[2] - Ord(SP)) AND $3C) SHR 2);

Triplet[2] := (((Kwartet[2] - Ord(SP)) AND $03) SHL 6) +

((Kwartet[3] - Ord(SP)) AND $3F)

  • Читать дальше
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: