PHP实现crc8校验

PHP实现crc8校验

  • 在对接Tcp通信过程中,遇到了crc8校验,刚好是没有用过的,特此来分享
  • 有这样一串协议"AA6400320730FFFF020000F6BB" 其中包头是AA 包尾是BB 包头后面四个字节是设备编号,按小端字节排序后的,也就是64003207 设备编号后面一个字节是功能码,也就是30 ,FFFF则是数据包的帧号,02 则是后面数据内容的长度,标识两个字节,而 0000 则代表两个字节的内容,则是成功的意思,后面的两个字节则代表crc8的校验结果,F6

crc8校验就是校验包头到内容的长度

方法

 function crc8($str)
    {
        //AA 64 00 32 07 30 FF FF 02 00 00 F6 BB
		//将字符串按两个字符分割成数组,也就是一个字节
        $data = str_split($str,2);

        $hex_array = array_map(function($value) {
            return "0x" . $value;
        }, $data);

        $arr = array_map('hexdec', $hex_array);

        $initialValue = 0x55;
        $polynomial = 0x07;
        $crc = $initialValue;

        foreach ($arr as $value) {
            $crc ^= $value;
            for ($i = 0; $i < 8; $i++) {
                if ($crc & 0x80) {
                    $crc = ($crc << 1) ^ $polynomial;
                } else {
                    $crc <<= 1;
                }
            }
            $crc = ($crc & 0xff);
        }

		//确保返回的校验结果是一个字节,之前遇到过返回了一个字符5,并不是一个完整的字节,导致16进制字符串不是完整的,出现了问题
        if(strlen(dechex($crc)) == 1)
        {
            return '0'.dechex($crc);
        }
        return dechex($crc);
    }

测试

$hex = 'AA6400320730FFFF020000';
$crc8 = Common::crc8($hex);

$this->writeJson(Status::CODE_OK,$crc8,'校验成功');

结果

通过测验刚好和上面示例中的crc校验匹配上

北溟有鱼QAQ博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论