Это функция, которая получает две строки и возвращает другую строку.Я буду включать объявления переменных в комментарии, так как они представлены в коде;поместите их в верхнюю часть функции.
function convert(str: AnsiString; const key: AnsiString = ''): AnsiString;
Если ключ пуст, то результатом будет просто str
:
begin
if key = '' then
Exit(str);
Первый параметр - это значение, которое должно быть«зашифровано», а второй - это ключ, который используется для этого шифрования.Длина ключа должна быть не менее восьми непробельных символов;все, что больше 32, игнорируется.Если ключ слишком короткий, PHP-скрипт завершится;вместо этого мы будем использовать оператор Assert
Delphi, поскольку ясно, что код никогда не должен был выполняться, даже если ключ неверен.(Завершение сценария не является исправимой ошибкой, которую должен был бы исправить пользователь.) В коде PHP используется оператор ?:
для выбора нужного значения длины, но функция Delphi Min
(из математической функции ) единица) выражает желание более четко.
// var ky: AnsiString;
ky := StringReplace(key, ' ', '', [rfReplaceAll]);
Assert(Length(ky) >= 8, 'key error');
// var kl: Integer;
kl := Min(Length(ky), 32);
Массив k
используется для хранения чисел, представляющих пять младших битов каждого символа в ключе.В PHP массив будет автоматически увеличиваться до необходимого размера в зависимости от используемого индекса.В Delphi нам нужно заранее выделить место.Поскольку он установлен в цикле, который проходит по каждому символу ключа, мы знаем, что массив будет одинаковой длины.
// var k: array of Byte;
SetLength(k, kl);
// var i: Integer;
for i := 0 to Pred(kl) do
k[i] := Ord(ky[i+1]) and $1f;
Затем каждый символ в строке, для которой установлен седьмой бит, изменяется в соответствии сна каждый последующий байт в массиве k
.Переменная j
отслеживает, какой байт ключа мы будем использовать следующим.
// var j: Integer;
j := 0;
for i := 1 to Length(str) do begin
// var e: Byte;
e := Ord(str[i]);
if (e and $e0) <> 0 then
str[i] := AnsiChar(e xor k[j]);
Inc(j);
if j = kl then
j := 0;
// The previous three lines can also be written j := (j + 1) mod kl
end;
Наконец, мы возвращаем новое значение str
:
Result := str;
end;