php 对数组 crc16,将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;

}

标签:php,c-3,crc16

来源: https://codeday.me/bug/20190626/1289974.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值