【发布时间】:2015-05-11 11:53:16
【问题描述】:
我正在尝试将 C 函数转换为执行 8 位 CRC 计算的 PHP。
原C代码:
uint8_t CRCCalc (uint8_t* pointer, uint16_t len) {
uint8_t CRC = 0x00;
uint16_t tmp;
while(len > 0) {
tmp = CRC << 1;
tmp += *pointer;
CRC = (tmp & 0xFF) + (tmp >> 8);
pointer++;
--len;
}
return CRC;
}
我想出的PHP代码是:
function crc8_calc($hex_string)
{
$bin_data = pack('H*',$hex_string);
$bin_length = strlen($bin_data);
$CRC = 0x00;
$pos = 0;
while($bin_length>0)
{
//$pos = $CRC << 1;
$CRC = ($bin_data[$pos] & 0xFF) + ($bin_data[$pos] >> 8);
$bin_length --;
$pos++ ;
}
return $CRC;
}
由于 PHP 函数的结果不正确,因此缺少某些内容。我对 C 不是很熟悉,所以不确定我的转换是否正确。 C函数给出正确的CRC
例如,如果字符串的十六进制表示为: 280500000805151001240000000010017475260004041001372068828503000000000000
CRC 应该是 D4。
我已经看到了以下用于 CRC8 计算的链接,但我似乎遗漏了一些东西
how to generate 8bit crc in php CRC8-Check in PHP
我也从这个答案中获取了一些我的转换代码 Convert C to PHP for CRC16 Function
【问题讨论】:
-
您为什么不尝试准确地翻译 C 代码?请注意,C 代码正在处理 16 位 变量
tmp。为什么你省略了<<shift 操作?另请注意,tmp += *pointer;表示tmp = tmp + *pointer和 nottmp = *pointer。 -
示例中的 C 代码无法编译。
-
@specializt 因为
Pointer++中的拼写错误? -
移位运算符被错误地注释掉了。 JeremyP 已经更正了 C 代码中的错字。谢谢
标签: php c crc code-conversion