CRC16校验码算法

crownsoft 2016-12-14 09:38:21
RFID读卡机CRC16校验码算法,说明文档提代C语言算法如下:
CRC16的C语言算法:
#define PRESET_VALUE 0xFFFF
#define POLYNOMIAL 0x8408
unsigned int uiCrc16Cal(unsigned char const * pucY, unsigned char ucX)
{
unsigned char ucI,ucJ;
unsigned short int uiCrcValue = PRESET_VALUE;

for(ucI = 0; ucI < ucX; ucI++)
{
uiCrcValue = uiCrcValue ^ *(pucY + ucI);
for(ucJ = 0; ucJ < 8; ucJ++)
{
if(uiCrcValue & 0x0001)
{
uiCrcValue = (uiCrcValue >> 1) ^ POLYNOMIAL;
}
else
{
uiCrcValue = (uiCrcValue >> 1);
}
}
}
return uiCrcValue;
}
pucY是要计算CRC16的字符数组的入口,ucX是字符数组中字符个数。

如何转成Delphi的函数?
示例:04 FF 21 19 95
04 00 21 D9 6A后两位为校验码
...全文
807 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyhoo163 2016-12-15
  • 打赏
  • 举报
回复
crownsoft 2016-12-14
  • 打赏
  • 举报
回复
网上找到了, function mjComCRC(buf: PByte;len: Integer): Word; var i,j: Integer; chr: Word; begin Result := $ffff; for j:=0 to len-1 do begin chr := PByte(LongWord(buf)+j)^ and $ff; Result := Result xor chr; for i:=0 to 8 -1 do begin if ((Result and 01)<>0) then Result := (Result shr 1) xor $8408 else Result := Result shr 1; end; Result := Result and $ffff; end; end; 感谢无名网友!
看那山瞧那水 2016-12-14
  • 打赏
  • 举报
回复
function Crc16Cal(const AData: array of Byte; ACount: Byte): LongWord; var i,j: Byte; begin Result := PRESET_VALUE; for i := 0 to ACount - 1 do begin Result := Result xor AData[i]; for j := 0 to 7 do begin if (Result and $0001) <> 0 then Result := (Result shr 1) xor POLYNOMIAL else Result := Result shr 1; end; end; end; 验证不对...........

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧