static const U16 crctab16[] = { 0x0000, 0x1189, ... };
U16 GetCrc16(const U8* pData, int nLength)
{
U16 fcs = 0xffff;
while(nLength > 0)
{
fcs = (fcs >> 8) ^ crctab16[fcs ^ *pData) & 0xff];
nLength--; pData++;
}
return ~fcs;
}
$crctab16 = array(0x0000, 0x1189, ... );
function getCrc16($pData)
{
$hexdata = pack('H*',$pData);
$nLength = strlen($hexdata);
$fcs = 0xFFFF;
$pos = 0;
while($nLength > 0)
{
$fcs = ($fcs >> 8) ^ $crctab16[($fcs ^ $hexdata[$pos]) & 0xFF];
$nLength--;
$pos++;
}
return ~$fcs;
}
我试图运行以下代码:
$str = "0A1344010400010005";
var_dump(getCrc16($str));
var_dump(bin2hex(getCrc16($str))); // result supposed to be 08 45
它似乎显示了错误的结果.当我尝试用其他值替换$str时,结果将始终是SAME.
我相信我的PHP代码可能有问题.但是,我似乎无法弄清楚原因.
解决方法:
试试这个
function crc16($sstr, $aParams = array()){
$aDefaults = array(
"polynome" => 0x1021,
"init" => 0xFFFF,
"xor_out" => 0,
);
foreach ($aDefaults as $key => $val){
if (!isset($aParams[$key])){
$aParams[$key] = $val;
}
}
$sstr .= "";
$crc = $aParams['init'];
$len = strlen($sstr);
$i = 0;
while ($len--){
$crc ^= ord($sstr[$i++]) << 8;
$crc &= 0xffff;
for ($j = 0; $j < 8; $j++){
$crc = ($crc & 0x8000) ? ($crc << 1) ^ $aParams['polynome'] : $crc << 1;
$crc &= 0xffff;
}
}
$crc ^= $aParams['xor_out'];
return $crc;
}