Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 862|回复: 0

java实现CRC校验码

[复制链接]

该用户从未签到

发表于 2011-9-18 12:43:52 | 显示全部楼层 |阅读模式
这两天项目中要使用到CRC校验功能,网上大量的例子是针对c、delphi的例子,前期没有做过,理论上也欠缺很多知识,在这里对java如何实现我们想要的crc校验功能做一下自己的总结,以下内容有本分转自网上,希望对有需要的朋友作能够参考一下。
一、什么是CRC校验:
      CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。
   二、CRC的原理:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得
V(x)=A(x)g(x)=xRm(x)+r(x);
其中:    m(x)为K次信息多项式, r(x)为R-1次校验多项式,
         g(x)称为生成多项式:
g(x)=g0+g1x+ g2x2+...+g(R-1)x(R-1)+gRxR
发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。                                         
(对于细节性的知识朋友们可以在网上找到大量资料这里不再做重复说明)   (以上来自网络转载)
三、CRC校验码方式有哪些:
          1 byte checksum
          CRC-16   
          CRC-16 (Modbus)  
          CRC-16 (Sick)  
          CRC-CCITT (XModem)  
          CRC-CCITT (0xFFFF)
          CRC-CCITT (0x1D0F)
          CRC-CCITT (Kermit)  
          CRC-DNP           
          CRC-32
对于以上方式来说结果可以生成为ASCII、HEX等方式
四、JAVA实现CRC校验
     (1)这里对于CRC-CCITT四种方式进行梳理:
  1. public class CRC {
  2.     /**
  3.      * CRC-CCITT(Kermit)验证模式
  4.      * @param str
  5.      * @return
  6.      */
  7. public String CRC_CCITT_Kermit(String str) {
  8.   int j, b, rrrc, c, i;
  9.   String tmpBalance;
  10.   int k;
  11.   rrrc = 0;
  12.   tmpBalance = str;
  13.   int tmpInt, CharInt;
  14.   String tmpChar, tmpStr;
  15.   tmpStr = "";
  16.   int High;
  17.   int Low;
  18. for (j = 1; j <= 3; j++) {
  19.   if (Character.isDigit(tmpBalance.charAt(2 * j - 2))) {
  20.   High = Integer.parseInt(tmpBalance.charAt(2 * j - 2) + "");
  21. } else {
  22.   High = 0;
  23. }
  24. if (Character.isDigit(tmpBalance.charAt(2 * j - 1))) {
  25.   Low = Integer.parseInt(tmpBalance.charAt(2 * j - 1) + "");
  26. } else {
  27.     Low = 0;
  28.    }
  29.    High = (High & 0xff) << 4;
  30.    High = High | Low;
  31.    k = High;
  32.    for (i = 1; i <= 8; i++) {
  33.     c = rrrc & 1;
  34.     rrrc = rrrc >> 1;
  35.     if ((k & 1) != 0) {
  36.      rrrc = rrrc | 0x8000;
  37.     }
  38.     if (c != 0) {
  39.      rrrc = rrrc ^ 0x8408;
  40.     }
  41.     k = k >> 1;
  42.    }
  43.   }
  44.   for (i = 1; i <= 16; i++) {
  45.    c = rrrc & 1;
  46.    rrrc = rrrc >> 1;
  47.    if (c != 0) {
  48.     rrrc = rrrc ^ 0x8408;
  49.    }
  50.   }
  51.   c = rrrc >> 8;
  52.   b = rrrc << 8;
  53.   rrrc = c | b;
  54.   tmpInt = rrrc;
  55.   tmpStr = "";
  56.   for (i = 1; i <= 4; i++) {
  57.    tmpChar = "";
  58.    CharInt = tmpInt % 16;
  59.    if (CharInt > 9) {
  60.     switch (CharInt) {
  61.     case 10:
  62.      tmpChar = "A";
  63.      break;
  64.     case 11:
  65.      tmpChar = "B";
  66.      break;
  67.     case 12:
  68.      tmpChar = "C";
  69.      break;
  70.     case 13:
  71.      tmpChar = "D";
  72.      break;
  73.     case 14:
  74.      tmpChar = "E";
  75.      break;
  76.     case 15:
  77.      tmpChar = "F";
  78.      break;
  79.     }
  80.    } else {
  81.     tmpChar = Integer.toString(CharInt);
  82.    }
  83.    tmpInt = tmpInt / 16;
  84.    tmpStr = tmpChar + tmpStr;
  85.   }
  86.   System.out.println("tmpStr:" + tmpStr);
  87.   return tmpStr;
  88. }
  89. /**
  90.   * CRC-CCITT(XModem)
  91.   * CRC-CCITT(0xFFFF)  
  92.   * CRC-CCITT(0x1D0F)
  93.   * 校验模式
  94.   * @param flag< XModem(flag=1) 0xFFFF(flag=2) 0x1D0F(flag=3)>
  95.   * @param str
  96.   * @return
  97.   */
  98. public String  CRC_CCITT( int flag,String str) {
  99.         int crc = 0x00;          // initial value
  100.         int polynomial = 0x1021;   
  101.         byte[] bytes=str.getBytes();
  102.         
  103.         switch(flag){
  104.         case 1:
  105.          crc=0x00;
  106.          break;
  107.         case 2:
  108.          crc=0xFFFF;
  109.          break;
  110.         case 3:
  111.          crc=0x1D0F;
  112.          break;
  113.         
  114.         }
  115.         for (int index = 0 ; index< bytes.length; index++) {
  116.             byte b = bytes[index];
  117.             for (int i = 0; i < 8; i++) {
  118.                 boolean bit = ((b   >> (7-i) & 1) == 1);
  119.                 boolean c15 = ((crc >> 15    & 1) == 1);
  120.                 crc <<= 1;
  121.                 if (c15 ^ bit) crc ^= polynomial;
  122.              }
  123.         }
  124.         crc &= 0xffff;
  125.         str = Integer.toHexString(crc);
  126.         return str;
  127.         
  128.     }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 02:15 , Processed in 0.360107 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表