php对接硬件CRC-16/XMODEM校验

225 阅读1分钟
/**
 * @return void 将数字转为2字节的16进制
 */
public static function pack16($num){
    $b=pack('n',$num);
    $s = unpack('H4s',$b)['s'];
    return $s;
}

/**(十六进制字符串),每两位长度转为10进制,然后再转为字节数组
 * @param $str 16进制字符串
 * @return array
 * 
 */

public static function stringToByteArray($str) {

    $byteArr = [];
    foreach(str_split($str,2) as $chunk){
        $num = hexdec($chunk);
        $byteArr[] = self::getIntByte($num);
    }
    return $byteArr;
}

public static function getIntByte($int)
{
    $n = $int & 0x000000FF;
    if (128 == ($n & 128)) {
        return $n - 256;
    } else {
        return $n;
    }
}

/**
 * @param $str 16进制字符串
 * @return int
 */
public static function crc_xiaoyan($str){
    $arr = self::stringToByteArray($str);
    $crc = 0x0000;
    $polynomial = 0x1021;
    foreach ($arr AS $b){
        for ($i=0;$i<8;$i++){
            $bit = ((intval($b)>>(7-$i)&1)==1);
            $c15 = (($crc>>15 & 1)==1);
            $crc<<=1;
            if ($c15^$bit)$crc^=$polynomial;
        }
    }
    $crc &= 0xffff;

    $xiaoyan16 = self::pack16($crc);

    return $xiaoyan16;
}
```D CRC 校验