Интернет решения от доктора Боба - [2]

Шрифт
Интервал

Результат затем используется как индекс в таблицу набора символов UUEncode.

Так как каждый кодированный символ представляет из себя простой символ таблицы ASCII начинающийся с позиции 33 и до позиции 64 + 32 = 96, то мы можем просто прибавить ASCII значение символа пробела, что бы получить требуемый UUкодированный символ.

Алгоритм преобразовывает три двоичных символа (Triplet) в четыре (Kwartet) UUкодированных символа и может быть реализован в Паскале следующим образом.

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

end{Triplet2Kwartet};

Данная процедура состоит из из двух частей: в первой части 24 бита (3 * 8) из триплета преобразовываются в 24 бита (4 * 6) квартета. Во второй части алгоритма, мы добавляем ASCII код символа пробела к каждому квартету. ASCII код символа пробела закодирован как Ord(SP), где SP определен как символ пробела или #32. Заметим, что для случая когда квартет равен 0, то мы не добавляем значение #32, поскольку многие почтовые программы имеют проблемы с этим символом, просто в этом случае добавляем код со значением 64 ($40), в результате получаем вместо пробела код обратного апострофа, который нейтрален к алгоритму декодирования, одинаково работающий как для пробела так и для апострофа.

Говоря о декодировании, реализация его в Паскале преобразования квартетов обратно в триплеты следующая:

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

var

>   i: Integer;

begin

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

end{Kwartet2Triplet};

Если размер триплета в файле менее 3 байт (4 байта в квартете), то производится добавление структуры нулями при кодировании и декодировании.

1.1.2. XXEncode и XXDecode

UUкодирование было наиболее популярным форматом 64 битного кодирования. Ограничение состояло в том, что набор символов не мог транслироваться между наборами ASCII и EBCDIC (IBM мейнфреймы). XXencode очень похож на UUEncode, просто используется другой набор символов, что более удобно между различными типами систем, например как указано выше между EBCDIC и ASCII.

Набор символов XXEncode
0 + 8 6 16 E 24 M 32 U 40 c 48 k 56 s
1 – 9 7 17 F 25 N 33 V 41 d 49 l 57 t
2 0 10 8 18 G 26 O 34 W 42 e 50 m 58 u
3 1 11 9 19 H 27 P 35 X 43 f 51 n 59 v
4 2 12 A 20 I 28 Q 36 Y 44 g 52 o 60 w
5 3 13 B  21 J 29 R 37 Z 45 h 53 p 61 x
6 4 14 C 22 K 30 S 38 a 46 i 54 q 62 y
7 515 D23 L31 T39 b47 j55 r63 z

Заметим что если для 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);


Рекомендуем почитать
Язык PL/SQL

В учебно-методическом пособии рассматриваются основы языка программирования PL/SQL, реализованного в системе управления базами данных Oracle Database Server. Приводятся сведения о поддерживаемых типах данных, структуре программ PL/SQL и выполнении SQL-предложений в них. Отдельно рассмотрено создание хранимых в базах данных Oracle программ PL/SQL – процедур, функций, пакетов и триггеров.


Пишем драйвер Windows на ассемблере

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Язык программирования С# 2005 и платформа .NET 2.0.

В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML.


Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Информационная технология. Руководство по управлению документированием программного обеспечения

ГОСУДАРСТВЕННЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИИнформационная технологияРУКОВОДСТВО ПО УПРАВЛЕНИЮ ДОКУМЕНТИРОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯInformation technology. Guidelines for the management of software documentationИздание официальноеДата введения 1994-07-01ГОССТАНДАРТ РОССИИ Москва© Издательство стандартов, 1994.


Самоучитель UML

Самоучитель UMLПервое издание.В книге рассматриваются основы UML – унифицированного языка моделирования для описания, визуализации и документирования объектно-ориентированных систем и бизнес-процессов в ходе разработки программных приложений. Подробно описываются базовые понятия UML, необходимые для построения объектно-ориентированной модели системы с использованием графической нотации. Изложение сопровождается примерами разработки отдельных диаграмм, которые необходимы для представления информационной модели системы.