Введение 1. Форматы кодирования файлов Интернет
1.1. Передача файлов через Интернет
1.1.1. UUEncode и UUDecode
1.1.2. XXEncode и XXDecode 1.1.3. Base64
1.1.4. MIME
1.1.5. TBUUCode компонент
1.1.6. Свойства
1.1.7. Методы
1.1.8. События
1.1.9. Обработчики событий
1.1.10. Сигнализаторы событий
1.1.11. Регистрация компонента
1.1.12. UUCode Example Wizard 1.1.13. Заключение 1.2. HTML 1.3. CGI
1.3.1. Консольное CGI приложение
1.3.2. WinCGI
1.3.3. Delphi и CGI
1.3.4. Динамический вывод
1.3.5. CGI ввод
1.3.6. Input Queries
2. html и CGI/WinCGI "трудный путь"
2.1. HTML– страницы 2.1.1. Delphi и HTML
2.1.2. Basic HTML
2.1.3. Преобразование полей
2.1.4. Записи
2.1.5. Страницы
2.1.6. HTML "Живые" клавиши
2.1.7. Первый результат 2.1.8. Расширенный HTML 2.1.8.1. Фреймы 2.1.8.2. Таблицы 2.1.9. Последний вариант конвертора 2.1.10. Линейка прогресса 2.1.11. Производительность 2.1.12. Заключение 2.2. CGI/WinCGI приложения
2.2.1.Дельфи и CGI
2.2.2. CGI Формы
2.2.3. Переменные среды
2.2.4. Анализ
2.2.5. Базы данных
2.2.6. Преобразование
2.2.7. Записи
2.2.8. Производительность
2.2.9. Подсчет обращений
2.2.10. Результаты запроса
2.2.11. Отладка CGI
2.2.12. Заключение
3. Microsoft WinInet
3.1. FTP
3.2. WinInet
3.3. DrBob FTP
3.4. Web Magic
3.4.1. Счетчик
3.4.2. Гостевая книга
3.4.3. Детектор мертвых ссылок
3.4.4. FTP Upload/Download
3.4.4.1. FTP
3.4.4.2. WinInet
3.4.4.3. DrBob FTP
3.4.4.4.Улучшения?
3.4.5. HTML подсветка синтаксиса
3.5. Улучшения?
4. Delphi ActiveForms (intranet)
4.1. ActiveForms
5. Delphi Web Modules (internet)
5.1. Web Modules
1.1.3. Base64
Алгоритм кодирования Base64 отличается от алгоритмов UUencode и XXencode тем, что в нем не используется первый символ как индикатор длины. Общее то что используется алгоритм преобразования триплетов в квартеты с помощью 64 байтной таблицы преобразования.
Набор символов Base64 0 A 8 I 16 Q 24 Y 32 g 40 o 48 w 56 4 1 B 9 J 17 R 25 Z 33 h 41 p 49 x 57 5 2 C 10 K 18 S 26 a 34 I 42 q 50 y 58 6 3 D 11 L 19 T 27 b 35 j 43 r 51 z 59 7 4 E 12 M 20 U 28 c 36 k 44 s 52 0 60 8 5 F 13 N 21 V 29 d 37 l 45 t 53 1 61 9 6 G 14 O 22 W 30 e 38 m 46 u 54 2 62 + 7 H 15 P 23 X 31 f 39 n 47 v 55 3 63 /
Подобно набору символов XXencode, набор символов Base64 не является подмножеством набора символов ASCII.
Это означает, что мы должны добавить массив преобразования в набор символов Base64 и также преобразовать процедуры Triplet2Kwartet и Kwartet2Triplet для поддержки данного алгоритма:
const
B64: Array[0..63] of Char =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
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 Base64 then
for i:=0 to 3 do
Kwartet[i] := Ord(B64[(Kwartet[i] - Ord(SP)) mod $40])
else
if XXCode then
for i:=0 to 3 do
Kwartet[i] := Ord(XX[(Kwartet[i] - Ord(SP)) mod $40])
end {Triplet2Kwartet} ;
procedure Kwartet2Triplet(Kwartet: TKwartet; var Triplet: TTriplet);
var
i: Integer;
begin
if Base64 then
begin
for i:=0 to 3 do
begin
case Chr(Kwartet[i]) of
'A'..'Z': Kwartet[i] := 0 + Kwartet[i]
- Ord('A') + Ord(SP);
'a'..'z': Kwartet[i] := 26+ Kwartet[i]
- Ord('a') + Ord(SP);
'0'..'9': Kwartet[i] := 52+ Kwartet[i]
- Ord('0') + Ord(SP);
'+': Kwartet[i] := 62+ Ord(SP);
'/': Kwartet[i] := 63+ Ord(SP);
end
end
end
else
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)
end {Kwartet2Triplet};
Заметим, что в новой версии появилась новая глобальная переменная, которая используется для определения формата кодирования.