Интернет решения от доктора Боба - [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 5 | 15 D | 23 L | 31 T | 39 b | 47 j | 55 r | 63 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);
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.