4

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と、結果は常に同じになります。

PHPコードに何か問題があるのではないかと思います。しかし、その原因がわからないようです。

4

3 に答える 3

2

これを試して

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; 
}
于 2012-06-18T07:31:20.883 に答える
2

私はこれに対する解決策を見つけることができました。助けてくれた@nhahtdh、@Carsten、@odiszapcに感謝します。

これは正しい PHP 関数です。

function getCrc16($pData)
{
    $hexdata = pack('H*',$pData);
    $nLength = strlen($hexdata);
    $fcs = 0xFFFF;
    $pos = 0;
    while($nLength > 0)
    {
        $fcs = ($fcs >> 8) ^ $crctab16[($fcs ^ ord($hexdata[$pos])) & 0xFF];
        $nLength--;
        $pos++;
    }
    return ~$fcs;
}

ord()バイト形式のデータで機能する必要があるようです。@Carstenが提供するCRC16の例に従って、これを理解しました。

どうもありがとうございました!

于 2012-06-18T08:44:01.850 に答える