美文网首页
CRC-8校验和:java和C语言算法

CRC-8校验和:java和C语言算法

作者: maiduoduo | 来源:发表于2020-12-11 11:39 被阅读0次

1、 CRC8标准生成多项式

CRC-8       x8+x5+x4+1              0x31(0x131)
CRC-8       x8+x2+x1+1              0x07(0x107)
CRC-8       x8+x6+x4+x3+x2+x1       0x5E(0x15E)

注:
1.由于多项式的最高为都为1,并且在代码的crc8计算中,最高位也是不使用的,
所以在多项式记录时都去掉了最高位。
2.服务器需要检验设备传输的数据,设备c语言写的,CRC8 校验多项式为 x8+x2+x+1

这里记录的是CRC-8 x8+x2+x1+1 0x07(0x107)这种检验和算法>>>

C语言算法:

unsigned char CRC8(unsigned char *ptr,unsigned char len)
{
     unsigned char crc;    
     unsigned char i;    
     crc = 0;    
     while(len--)
     {
         crc ^= *ptr++;       
         for(i = 0;i < 8;i++)       
         {
             if(crc & 0x80)           
             {
                crc = (crc << 1) ^ 0x07;           
             }
             else crc <<= 1;
         }
     }
     return crc;
}   

Java语言算法(根据上述C语言的算法进行编写):

 //TODO:-----------------根据C写法转译--------------------------------------
    /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */

    /**
     * CRC8 校验 多项式  x8+x2+x+1
     * @param data
     * @return  校验和
     */
    public static  byte calcCrc8(byte[] data){
        byte crc = 0;
        for (int j = 0; j < data.length; j++) {
            crc ^= data[j];
            for (int i = 0; i < 8; i++) {
                if ((crc & 0x80) != 0) {
                    crc = (byte) ((crc)<< 1);
                    crc ^= 0x107;
                } else {
                    crc = (byte) ((crc)<< 1);
                }
            }
        }
        return crc;
    }

//TODO:-----------------根据C写法转译--------------------------------------
  

结果

通过CRC在线计算器验证,C语言和Java语言算法结果与计算器结果一致,算法有效
CRC在线计算器:http://www.ip33.com/crc.html

示例:

计算器结果

image.png

代码算法结果

image.png

相关文章

网友评论

      本文标题:CRC-8校验和:java和C语言算法

      本文链接:https://www.haomeiwen.com/subject/pmcjgktx.html