zoukankan      html  css  js  c++  java
  • 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;
        }
     
  • 相关阅读:
    蛋糕切割【数论,数学】
    【洛谷P1082】同余方程【扩欧】
    【洛谷P4003】无限之环【费用流】
    【洛谷P4503】企鹅QQ【字符串hash】
    【洛谷P3084】照片Photo【单调队列dp】
    【洛谷P2286】宠物收养场【Treap】
    POJ 3984 迷宫问题
    牛客IOI周赛19-普及组题解
    UVA 11624 Fire!
    FZU 2150 Fire Game
  • 原文地址:https://www.cnblogs.com/BeautyFuture/p/6077651.html
Copyright © 2011-2022 走看看