function UpdateCrc16(Value: Byte; Crc16: Word): Word;inline;
begin
Result := ((Crc16 shr 8) and $00FF) xor
crc16tab[Byte(Crc16 xor (Word(Value)) and $00FF)];
end;
function Crc16(const Value: AnsiString): Word;inline;
var
n: Integer;
begin
Result := $FFFF;
for n := 1 to Length(Value) do
Result := UpdateCrc16(Ord(Value[n]), Result);
end;
На вход мы получаем строку
Заданм срс как переменную результат равную ffff.
Потом идёт цикл фор, от 1 до размера строки
Переменной результат присваиваем новое значение передавая расчёт в другую Функцию, отправив туда
Ord(value[n]) (наверное это первый элемент строки в байтах) и срс которая в переменной результат
Функция апдейт срс принимает первый символ и записывает так же в value, а срс в срс вместо переменной результат
А вот дальше тут какая то непонятная магия происходит.
Почему то в право на 8 бит сдвигаем и в конец дописываем 8 единиц и выполняем исключающее или с какой то странный штукой