如何在PHP HEX中计算CRC16 CCITT?

Dra*_*ace 5 php hex crc crc16

我正在尝试使用PHP CRC16 CCITT函数来计算校验和。

设备向我发送了包含校验和的数据包:

10 00 00 00 00 00 00 00 12 51 09 08 00 18 00 04 02 14 00 0c 00 0c 02 1c 00 02 00 00 00 00 00 00 00 a0 77

校验和位于末尾: a0 77

我试过使用

如何在PHP中计算CRC16

将C转换为PHP以实现CRC16功能

没有成功,CRC 16计算返回:E6 F4而不是 a0 77

查找时,我返回了正确的十六进制信息:

100000000000000012510908001800040214000c000c021c0002000000000000

在网站http://www.lammertbies.nl/comm/info/crc-calculation.html上,但我无法复制它。(确保将输入类型选择为十六进制)

您能帮我弄清楚如何获取十六进制值字符串的crc16 CCITT吗

100000000000000012510908001800040214000c000c021c0002000000000000

我在寻找校验和 a0 77

小智 3

我能够通过如下实现生成相同的校验和:

define('CRC16POLYN', 0x1021);

function CRC16Normal($buffer) {
    $result = 0xFFFF;
    if (($length = strlen($buffer)) > 0) {
        for ($offset = 0; $offset < $length; $offset++) {
            $result ^= (ord($buffer[$offset]) << 8);
            for ($bitwise = 0; $bitwise < 8; $bitwise++) {
                if (($result <<= 1) & 0x10000) $result ^= CRC16POLYN;
                $result &= 0xFFFF;
            }
        }
    }
    return $result;
}

echo dechex(CRC16Normal(hex2bin('100000000000000012510908001800040214000c000c021c0002000000000000')));
Run Code Online (Sandbox Code Playgroud)

上面给出了a077输出。

代码片段位于https://forums.digitalpoint.com/threads/php-define-function-calculate-crc-16-ccitt.2584389/