Протокол USB использует циклический избыточный код (CRC - Cyclic Redundancy Checksums) для защиты полей пакета. Этот контроль является более мощным средством для обнаружения ошибок на уровне блоков данных. CRC- контроль представляет в своем роде алгоритм хэширования. Алгоритм 16-разрядной контрольной суммы: * В 16-битный регистр загружается число $FFFF; * Добавляются байты сообщений к текущему содержимому регистра по "Исключающему ИЛИ". Используются 8 бит данных. * Сдвигаем 16-битный регистр вправо на 1 бит; * Смотрим младший байт, если =0, то повтор сдвига; если =1, то делаем операцию "Исключающее ИЛИ" и полиноминального числа $А001; * Повторяем до тех пор, пока все байты не будут обработаны. //сдвиг битовой строки function fshl(var s:string):char; begin Result:=s[1]; Delete(); S:=s+'0'; end; //ксорим битовые строки procedure pXor (var s:string; str:string); var i:byte; begin for i:=1 to Length(str) do begin if s[i]=str[i] then s[i]:='0' else s[i]:='1' end; end; //CRC16 procedure TForm1.Button2Click(Sender: TObject); var s:string; i:byte; Result:string; begin Result:='1111111111111111'; s:=Edit3.text; for i:=1 to length(s) do if s[i]<>fshl(result) then pxor(result,'1000000000000101'); pxor(result,'1111111111111111'); Edit4.text:=result; end; //CRC5 procedure TForm1.Button1Click(Sender: TObject); var s:string; i:byte; Result:string; begin Result:='11111'; s:=Edit1.text; for i:=1 to length(s) do if s[i]<>fshl(result) then pxor(result,'00101'); pxor(result,'11111'); Edit2.text:=result; end;
|