Java CRC4校验

原创 2015年07月10日 19:17:15

题目要求

要发送的数据为1101011011。采用CRC的生成多项式是P(X)=X4+X+1。试求应添加在数据后面的余数。为该数据添加CRC码,并验证他的正确性,改动CRC最后一位,验证他的正确性。

算法设计

① 循环计算,计算次数为扩大后的数据长度
② 如果数据首位不是0,分别将数据,特征码,校验首位所用的数据右移一位。否则执行③
③ 将特征码,校验 首位所用数据右移一位
④ 待求数如果小于0x10,跳出循环

全部代码

public class main {
    private static final  short poly = 0x13;         //1 0011
    /**
     * 计算余数
     * @param num 待检测序列
     * @return  余数
     */
    public static short getCrc(short num){

        short extendPoly = (short) (poly << 9) ;                  //10 0110 0000 0000
        short data = (short) (num << 4);     //待发送数据左移四位 11 0101 1011 0000
        short detectNum = 0x2000;                   //校验首位  10 0000 0000 0000



        String stringData = Integer.toBinaryString(data);         //转字符串,获取长度
        for (int i = 0; i < stringData.length(); i ++){
            String stringa = Integer.toBinaryString(data);
            String stringb = Integer.toBinaryString(extendPoly);
            if (data < 0x10){
                break;
            }else{         
                if((data & detectNum) != 0){
                    data = (short) (extendPoly ^ data);                 
                    System.out.println(stringa);

                    extendPoly  = (short) (extendPoly >> 1);                    
                    System.out.println(stringb);

                    System.out.println("---------------------");                    
                    detectNum = (short) (detectNum >> 1);
           }else{
               detectNum = (short) (detectNum >> 1);
               extendPoly  = (short) (extendPoly >> 1);
               System.out.println(stringa);
               System.out.println(stringb);
               System.out.println("---------------------");
           }
            }

        }
        String stringRemainder =  Integer.toBinaryString(data);
        System.out.println("余数为:"+stringRemainder);
        return data;
    }

    /**
     * 合成发送序列
     * @param data  带传送数据
     * @param remainder  余数
     * @return  检验序列FCS
     */
    public static short getFCS(short data,short remainder){

        short FCS = (short) ((data << 4) + remainder);             //11 0101 1011 1110
        String stringFCS =  Integer.toBinaryString(FCS);
        System.out.println("\nFCS序列为:"+stringFCS+"\n");
        return FCS;
    }

    /**
     * 检测接收到的序列
     * @param receiveData  接收数据
     */
    public static void checkFCS(short receiveData){
        short extendPoly = (short) (poly << 9) ;                   //10 0110 0000 0000
        short detectNum = 0x2000;                                  //校验首位  10 0000 0000 0000

        String stringFCS = Integer.toBinaryString(receiveData);         //转字符串,获取长度
        for (int i = 0; i < stringFCS.length(); i ++){
            String stringa = Integer.toBinaryString(receiveData);
            String stringb = Integer.toBinaryString(extendPoly);
            if (receiveData < 0x10){
                break;
            }else{         
                if((receiveData & detectNum) != 0){
                    receiveData = (short) (extendPoly ^ receiveData);                   
                    System.out.println(stringa);

                    extendPoly  = (short) (extendPoly >> 1);                    
                    System.out.println(stringb);

                    System.out.println("---------------------");

                    detectNum = (short) (detectNum >> 1);
           }else{
               detectNum = (short) (detectNum >> 1);
               extendPoly  = (short) (extendPoly >> 1);
               System.out.println(stringa);
               System.out.println(stringb);
               System.out.println("---------------------");
           }
        }
    }
        System.out.println("余数为:"+receiveData);
        if(receiveData == 0)
            System.out.println("没有差错,接收帧");
        else {
            System.out.println("出现差错,丢弃帧");
        }       
    }


    public static void main(String[] args) {    
            short num = 859;            
            String binaryString = Integer.toBinaryString(num);
            System.out.println("输入数据为: "+binaryString+"\n");
            short remainder = getCrc(num);

            short FCS = getFCS(num,remainder);
            checkFCS(FCS);

            System.out.println("\n测试,改变CRC最后一位");
            short errRemainder = 0xf;              //测试,改变最后余数最后一位
            short testFcs = getFCS(num,errRemainder);
            checkFCS(testFcs);                  
    }
}

小结

由于做课程设计的时候在网上没有找到CRC4校验的JAVA代码,自己试着写了一个,还有很多地方写的不好,欢迎大家帮忙改进。

java实现CRC校验码

     这两天项目中要使用到CRC校验功能,网上大量的例子是针对c、delphi的例子,前期没有做过,理论上也欠缺很多知识,在这里对java如何实现我们想要的crc校验功能做一下自己的总结,以下内容...

STM32F4学习笔记11——CRC循环冗余校验

关于CRC校验有以下几个方面 1.模2除(也就是异或)。 2.多项式与二进制关系(x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0,x的最高幂次为R...

java 实现CRC32校验

原文链接:http://blog.csdn.net/liuzhengkang/article/details/3116544 实现了CRC32校验,本来java那边是很简单的,直接用  java.u...

JAVA循环冗余校验(CRC32)

CRC32简介CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验。...

Java语言实现CRC32校验

源代码: package crcNew; public class CRC32 { private int crc; private String mx; public CRC32(Str...
  • zp1318
  • zp1318
  • 2016年06月01日 23:55
  • 811

JAVA版CRC校验

JAVA版的CRC校验代码,适用于英文校验和中文叫校验

Java CRC8校验

Java版本的CRC8校验,查表法,效率不会很差吧, 需要CRC16的看这里http://blog.csdn.net/trbbadboy/article/details/42145461 /...

java版CRC16(Modbus)校验_2016_3_21

在TCP连接时,传递的数据需要加上CRC校验位,验证数据的完成性。 而在获取到服务器端的数据时,楼主偷懒了,未校验CRC WORD ModbusCRC(BYTE * pData, BYTE l...

Java自定义协议报文封装 添加Crc32校验

开启两个线程,模拟Socket服务端和客户端通信,将数据封装为指定格式报文发送 代码:...
  • Mr_Sk
  • Mr_Sk
  • 2016年04月29日 23:58
  • 2604
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java CRC4校验
举报原因:
原因补充:

(最多只允许输入30个字)