Здравствуйте, netch80, Вы писали:
N>Скорее всего разница в том, что в википедии названо RefIn. Для линий связи принято начинать с младшего бита.
N>В программу, вестимо.
Или сдвигать влево и брать самый левый до сдвига, или сдвигать вправо и брать младший бит.
Спасибо, Вы правы

Вот работающий алгоритм на паскале, для
Name : CRC 16
Width : 16
Poly : 8005
Init : 0000
RefIn : True
RefOut : True
XorOut : 0000
Check : BB3D
procedure TCrc16Calculator.Init(Polynomial: word);
var
I, r: word;
j: byte;
begin
for I:= 0 to 255 do
begin
r:= I;
for j:= 0 to 7 do
begin
if (r AND $0001) = $0001 then
r:= (r shr 1) xor Polynomial
else
r:= r shr 1;
end;
FCrcTable[I]:= r;
end;
end;
type
TByteArray = packed array[1..(MaxInt-1)] of byte;
PByteArray = ^TByteArray;
function TCrc16Calculator.calcCrc(Data: Pointer; DataSize: Integer): word;
var
DataPtr: PByteArray;
I: Integer;
idx: Integer;
begin
DataPtr:= Data;
Result:= 0;
for I:= 1 to DataSize do
begin
Idx:= ((Result and $FF) xor DataPtr^[I]);
Result:= FCrcTable[Idx] xor (Result shr 8);
end;
end;
procedure testStdSequence();
var
calc: TCrc16Calculator;
arr: string;
begin
arr:= '123456789';
calc:= TCrc16Calculator.Create($A001);//$A001 == реверсированное $8005
Assert(calc.calcCrc(@arr[1], 9) = $BB3D);
end;