微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将C转换为PHP以获取CRC16功能

我需要帮助将C代码转换PHP.以下是C代码

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;
}

我有以下PHP代码,我已设法转换到目前为止:

$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; 
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐