crc循环冗余校验

循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。

 

 

位运算符
例子名称结果
$a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。
$a | $b Or(按位或) 将把 $a 和 $b 中任何一个为 1 的位设为 1。
$a ^ $b Xor(按位异或) 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
~ $a Not(按位取反) 将 $a 中为 0 的位设为 1,反之亦然。
$a << $b Shift left(左移) 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
$a >> $b Shift right(右移) 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

 

crc6_itu 生成6位2进制数值的校验码
//PHP
    
    /**
     * [crc6_itu 生成6位2进制数值的校验码]
     * @param  [str] $data [description]
     * @return [int]       [63]
     */
    function crc6_itu($data)
    {
        $crc = 0x00;         // Initial value
        $length = strlen($data);
        echo $length;
        $j = 0;
        while($length--)
        {   
            $crc ^= ord($data[$j]);        // crc ^= *data; data++; 占用8位 其实只用了7位 01111111 异或 01111111
            for ($i = 0; $i < 8; $i++) //执行8次
            {
                if ($crc & 1)//与位运算 一开始$crc 为0
                    $crc = ($crc >> 1) ^ 0x30;// 0x30 = (reverse 0x03)>>(8-6) //右移1次00111111 然后异或 0x03 0b00000011 按位反转(参见算法) 0b11000000 0xF0 右移两位 0b00110000 0x30
                else
                    $crc = ($crc >> 1);
            }
            $j++;
        }
        
        /***
            acrii值右移一位 确保最大为 00111111 最大63
            
            异或0x30 0b00110000 确保 高位变低位 低位 变高位
            
            0b00111111 ^ 0b00110000  0b00001111
            
            0b00000000 ^ 0b00110000  0b00110000
        
        
        ***/
        
        return $crc;
    }

echo crc6_itu('10005453');




//JS

console.log(crc6_itu('10005453'))
        
        /**
     * [crc6_itu 生成6位2进制数值的校验码]
     * @param  [str] $data [description]
     * @return [int]       [63]
     */
    function crc6_itu(data)
    {
        var crc = 0x00;         // Initial value
        var length = data.length;
        var j = 0;
        while(length--)
        {   
            crc ^= data[j].charCodeAt();        // crc ^= *data; data++;
            for (i = 0; i < 8; i++)
            {
                if (crc & 1)//与位运算
                    crc = (crc >> 1) ^ 0x30;// 0x30 = (reverse 0x03)>>(8-6)
                else
                    crc = (crc >> 1);
            }
            j++;
        }
        return crc;
    }

 

 

 

posted on 2016-11-18 14:33  小乔流水人家  阅读(243)  评论(0)    收藏  举报

导航