php - 将用 C 编写的 8 位 CRC 函数转换为 PHP

标签 php c crc code-conversion

我正在尝试将 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 函数中,发生的第一件事是将 CRC(到目前为止计算出的)左移 1 位(与乘以 2 相同),然后添加数组中的下一个字节,然后重新计算通过将 tmp 的两个字节相加来得到 CRC。

您的 PHP 示例不会执行初始移位,或将先前版本的 CRC 混合到下一个字节的计算中。

关于php - 将用 C 编写的 8 位 CRC 函数转换为 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30167000/

相关文章:

c - 为什么使用常量被认为比使用文字更好的编程风格?

循环冗余校验 (crc) 问题和属性?

php - mysql_insert_id 使用安全吗?

php - mySQL 查询 WHERE...OR... 快捷方式

javascript - Tokeninput将新标签保存到数据库

c - 如何在c中通过匿名管道发送消息

php - 多语言网页 : php + mysql + cookies

用 C 创建自己的随机生成器

java - 获取字节数组的 CRC 校验和并将其添加到该字节数组

collision-detection - CRC32 碰撞