美文网首页
CRC16 效验算法JAVA版

CRC16 效验算法JAVA版

作者: 哪有真爱 | 来源:发表于2019-10-09 09:05 被阅读0次

    CRC16的C语言算法:

    #define PRESET_VALUE 0xFFFF

    #define POLYNOMIAL  0x8408

    unsigned int uiCrc16Cal(unsigned char const  * pucY, unsigned char ucX)

    {

    unsigned char ucI,ucJ;

    unsigned short int  uiCrcValue = PRESET_VALUE;

        for(ucI = 0; ucI < ucX; ucI++)

      {

      uiCrcValue = uiCrcValue ^ *(pucY + ucI);

          for(ucJ = 0; ucJ < 8; ucJ++)

          {

      if(uiCrcValue & 0x0001)

        {

        uiCrcValue = (uiCrcValue >> 1) ^ POLYNOMIAL;

        }

      else

        {

        uiCrcValue = (uiCrcValue >> 1);

        }

    }

      }

    return uiCrcValue;

    }

    CRC16的java语言算法:

    package com.xxcg.platform.common.util;

    /**

    * 包    名 :com.xxcg.platform.common.util

    * 文 件 名 : Test

    * 描    述 : TODO

    * 作    者 :

    * 创建时间 :2019/5/9 0009 18:48

    * 版    本 :1.0

    */

    public class CRC16 {

      //crc效验

      public  CRC16(){

      }

      /**

        * crc16效验算法

        * @param data

        * @param length  长度

        * @return

        */

      public  static int crc16(byte[] data,int length){

          int  ucI,ucJ;

          int  uiCrcValue =0xFFFF;

          for ( ucI  = 0; ucI  < length; ucI ++) {

            uiCrcValue = uiCrcValue ^ (data[ucI] & 0xff);

            for(ucJ = 0; ucJ < 8; ucJ++){

                if((uiCrcValue & 0x0001)==1){

                  uiCrcValue = (uiCrcValue >> 1) ^ 0x8408;

                }else{

                  uiCrcValue = (uiCrcValue >> 1);

                }

            }

          }

          return  uiCrcValue;

      }

      /**

        * 效验和处理

        * @param data

        * @return

        */

      public  static int crc16(byte[] data){

          int  ucI,ucJ;

          int  uiCrcValue =0xFFFF;

          for ( ucI  = 0; ucI  < data.length; ucI ++) {

            uiCrcValue = uiCrcValue ^ (data[ucI] & 0xff);

            for(ucJ = 0; ucJ < 8; ucJ++){

                if((uiCrcValue & 0x0001)==1){

                  uiCrcValue = (uiCrcValue >> 1) ^ 0x8408;

                }else{

                  uiCrcValue = (uiCrcValue >> 1);

                }

            }

          }

          return  uiCrcValue;

      }

      public static byte[] int2ByteArray(int i){

          byte[] result=new byte[4];

          result[0]=(byte)((i >> 24)& 0xFF);

          result[1]=(byte)((i >> 16)& 0xFF);

          result[2]=(byte)((i >> 8)& 0xFF);

          result[3]=(byte)(i & 0xFF);

          return result;

      }

      /**

        * 低位 crc16

        * @param data

        * @param length

        * @return

        */

      public  static  byte  lsbCRC16(byte[] data,int length){

          int c =CRC16.crc16(data,length);

          byte[] bytes =    CRC16.int2ByteArray(c);

          return (byte) (bytes[3] & 0xff);

      }

      /**

        * 获取crc两位。 低位在前,高位在后

        * @param data

        * @param length

        * @return

        */

      public  static  byte[]  getLSBANDMSB(byte[] data,int length){

          int c =CRC16.crc16(data,length);

          byte[] bytes =    CRC16.int2ByteArray(c);

          byte[] bydata = new byte[2];

          bydata[0]=bytes[3];

          bydata[1]=bytes[2];

          return  bydata;

      }

      /**

        * 低位 crc16

        * @param data

        * @param length

        * @return

        */

      public  static  byte  msbCRC16(byte[] data,int length){

          int c =CRC16.crc16(data,length);

          byte[] bytes =    CRC16.int2ByteArray(c);

          return (byte) (bytes[2] & 0xff);

      }

      public static void main(String[] args) {

          byte[] data =  new byte[] { 0x05, 0x00, 0x40, 0x01,  (byte) 0x99,0x3A};

          byte c =CRC16.lsbCRC16(data,4);

          System.out.println(c & 0xff);

      }

    }

    相关文章

      网友评论

          本文标题:CRC16 效验算法JAVA版

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