求delphi高手转换个C语言的CRC16算法,算法如下

 unsigned short CalcCrc16(unsigned char * pData, int nLength)
{
unsigned short cRc_16 = 0x0000;
const unsigned short cnCRC_16 = 0x8005;
unsigned long cRctable_16[256];
unsigned short i,j,k;
for (i=0,k=0; i<256; i++,k++)
{
cRc_16 = i<<8;
for (j=8;j>0;j--)
{
if (cRc_16&0x8000)
cRc_16 = (cRc_16<<=1)^cnCRC_16;
else
cRc_16<<=1;
}
cRctable_16[k] = cRc_16;
}
while (nLength>0)
{
cRc_16 = (cRc_16 << 8) ^ cRctable_16[((cRc_16>>8) ^ *pData) & 0xff];
nLength--;
pData++;
}
return cRc_16;
}

https://blog.csdn.net/2004v2004/article/details/6311586

把其中的 crc:=crc and $7FFF; 和 GENP=$A001; 换成你的 0000 和 8005

function CalcCrc16(pData:pointer;nLength:integer):word;
const cnCRC_16 = $8005;
var cRc_16 :word;
cRctable_16:array [0..255] of longword;
i,j,k:word;
p:^byte;
begin
p:=pData;
cRc_16:=0;
for i:=0 to 255 do
begin
k:=i;
cRc_16 := i shl 8;
for j:=8 downto 1 do
begin
if boolean(cRc_16 and $8000) then cRc_16 := (cRc_16 shl 1) xor cnCRC_16
else cRc_16 := (cRc_16 shl 1);
end;
cRctable_16[k] := cRc_16;
end;
while (nLength>0) do
begin
cRc_16 = (cRc_16 shl 8) xor cRctable_16[((cRc_16 shr 8) xor p^) and $ff];
dec(nLength);
inc(p);
end;
return cRc_16;
end;