В ходе судебного разбирательства с Microsoft были предложены четыре варианта решений:
1. Билл Гейтс должен застрелиться.
2. Билл Гейтс должен утопиться.
3. Билл Гейтс должен повеситься.
4. Билл Гейтс должен опубликовать исходные коды Windows.
{ 64-битное декодирование файлов }{ Arne de Bruijn }uses dos;
var
Base64: array[43..122] of byte;
var
T: text;
Chars: setof char;
S: string;
K, I, J: word;
Buf: pointer;
DShift: integer;
F: file;
B, B1: byte;
Decode: array[0..63] of byte;
Shift2: byte;
Size, W: word;
begin
FillChar(Base64, SizeOf(Base64), 255);
J := 0;
for I := 65 to 90 dobegin
Base64[I] := J;
Inc(J);
end;
for I := 97 to 122 dobegin
Base64[I] := J;
Inc(J);
end;
for I := 48 to 57 dobegin
Base64[I] := J;
Inc(J);
end;
Base64[43] := J;
Inc(J);
Base64[47] := J;
Inc(J);
if ParamCount = 0 thenbegin
WriteLn('UNBASE64 <mime-файл> [<выходной файл>]');
Halt(1);
end;
S := ParamStr(1);
assign(T, S);
GetMem(Buf, 32768);
SetTextBuf(T, Buf^, 32768);
{$I-}reset(T);
{$I+}if IOResult <> 0 thenbegin
WriteLn('Ошибка считывания ', S);
Halt(1);
end;
if ParamCount >= 2 then
S := ParamStr(2)
elsebegin
write('Расположение:');
ReadLn(S);
end;
assign(F, S);
{$I-}rewrite(F, 1);
{$I+}if IOResult <> 0 thenbegin
WriteLn('Ошибка создания ', S);
Halt(1);
end;
whilenot eof(T) dobegin
ReadLn(T, S);
if (S <> '') and (pos(' ', S) = 0) and (S[1] >= #43) and (S[1] <= #122) and
(Base64[byte(S[1])] <> 255) thenbegin
FillChar(Decode, SizeOf(Decode), 0);
DShift := 0;
J := 0;
Shift2 := 1;
Size := 255;
B := 0;
for I := 1 to Length(S) dobegincase S[I] of
#43..#122: B1 := Base64[Ord(S[I])];
else
B1 := 255;
end;
if B1 = 255 thenif S[I] = '=' thenbegin
B1 := 0;
if Size = 255 then
Size := J;
endelse
WriteLn('Ошибка символа:', S[I], ' (', Ord(S[I]), ')');
if DShift and 7 = 0 thenbegin
Decode[J] := byte(B1 shl 2);
DShift := 2;
endelsebegin
Decode[J] := Decode[J] or Hi(word(B1) shl (DShift + 2));
Decode[J + 1] := Lo(word(B1) shl (DShift + 2));
Inc(J);
Inc(DShift, 2);
end;
end;
if Size = 255 then
Size := J;
BlockWrite(F, Decode, Size);
end;
end;
Close(F);
close(T);
end.
Программа на языке Паскаль, которая реализует декодирование 64-битного base64. Она читает файл, указанный в командной строке, декодирует base64-данные в файле и записывает декодированные данные в другой файл, также указанный в командной строке.
Вот подробное описание кода:
Программа использует множество символов Chars для хранения алфавита base64.
Она инициализирует массив Base64 с 256 элементами, где каждый элемент присваивается значению от 0 до 63 в зависимости от соответствующего символа в множестве Chars.
Программа читает командные аргументы с помощью функции ParamStr. Если не указаны аргументы, она выводит сообщение об ошибке и завершается.
Она открывает файл ввода, указанный первым командным аргументом, с помощью процедур assign и reset.
Программа выделяет буфер Buf для чтения содержимого файла.
Она читает файл построчно с помощью процедуры ReadLn. Для каждой строки она проверяет, содержит ли она только символы base64 (т.е., между 43 и 122 включительно) и не является пустой строкой. Если это так, она декодирует base64-данные и записывает их в файл вывода.
Процесс декодирования заключается в:
Переводе символов base64 в соответствующие значения с помощью массива Base64.
Сдвиг-регистрации декодированных значений в буфер Decode.
Записи декодированных данных в файл вывода с помощью процедуры BlockWrite.
Программа также обрабатывает ошибки, такие как ошибки чтения или записи, печатая сообщения об ошибках и завершаясь с ненулевым кодом выхода.
Обратите внимание, что это реализация специфична для языка Паскаль и может не быть переносимой на другие языки программирования. Кроме того, она не оптимизирована для производительности, так как использует простой подход сдвиг-регистрации для декодирования.
В статье описывается программный код на языке Pascal для декодирования файлов с помощью алгоритма Base64.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.