这两天项目中要使用到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四种方式进行梳理:

public class CRC {

/**

* CRC-CCITT(Kermit)验证模式

* @param str

* @return

*/

public String CRC_CCITT_Kermit(String str) {

int j, b, rrrc, c, i;

String tmpBalance;

int k;

rrrc = 0;

tmpBalance = str;

int tmpInt, CharInt;

String tmpChar, tmpStr;

tmpStr = "";

int High;

int Low;

for (j = 1; j <= 3; j++) {

if (Character.isDigit(tmpBalance.charAt(2 * j - 2))) {

High = Integer.parseInt(tmpBalance.charAt(2 * j - 2) + "");

} else {

High = 0;

}

if (Character.isDigit(tmpBalance.charAt(2 * j - 1))) {

Low = Integer.parseInt(tmpBalance.charAt(2 * j - 1) + "");

} else {

Low = 0;

}

High = (High & 0xff) << 4;

High = High | Low;

k = High;

for (i = 1; i <= 8; i++) {

c = rrrc & 1;

rrrc = rrrc >> 1;

if ((k & 1) != 0) {

rrrc = rrrc | 0x8000;

}

if (c != 0) {

rrrc = rrrc ^ 0x8408;

}

k = k >> 1;

}

}

for (i = 1; i <= 16; i++) {

c = rrrc & 1;

rrrc = rrrc >> 1;

if (c != 0) {

rrrc = rrrc ^ 0x8408;

}

}

c = rrrc >> 8;

b = rrrc << 8;

rrrc = c | b;

tmpInt = rrrc;

tmpStr = "";

for (i = 1; i <= 4; i++) {

tmpChar = "";

CharInt = tmpInt % 16;

if (CharInt > 9) {

switch (CharInt) {

case 10:

tmpChar = "A";

break;

case 11:

tmpChar = "B";

break;

case 12:

tmpChar = "C";

break;

case 13:

tmpChar = "D";

break;

case 14:

tmpChar = "E";

break;

case 15:

tmpChar = "F";

break;

}

} else {

tmpChar = Integer.toString(CharInt);

}

tmpInt = tmpInt / 16;

tmpStr = tmpChar + tmpStr;

}

System.out.println("tmpStr:" + tmpStr);

return tmpStr;

}

/**

* CRC-CCITT(XModem)

* CRC-CCITT(0xFFFF)

* CRC-CCITT(0x1D0F)

* 校验模式

* @param flag< XModem(flag=1) 0xFFFF(flag=2) 0x1D0F(flag=3)>

* @param str

* @return

*/

public String CRC_CCITT( int flag,String str) {

int crc = 0x00; // initial value

int polynomial = 0x1021;

byte[] bytes=str.getBytes();

switch(flag){

case 1:

crc=0x00;

break;

case 2:

crc=0xFFFF;

break;

case 3:

crc=0x1D0F;

break;

}

for (int index = 0 ; index< bytes.length; index++) {

byte b = bytes[index];

for (int i = 0; i < 8; i++) {

boolean bit = ((b >> (7-i) & 1) == 1);

boolean c15 = ((crc >> 15 & 1) == 1);

crc <<= 1;

if (c15 ^ bit) crc ^= polynomial;

}

}

crc &= 0xffff;

str = Integer.toHexString(crc);

return str;

}

分享到:

2011-03-17 08:30

浏览 322

评论

java crc 校验码_java实现CRC校验码相关推荐

  1. java 转码_JAVA自带转码方式的学习

    最近工作中遇到一个问题,由于海外系统环境默认采用UTF-8格式编码,以支持多语言环境.而国内系统由于只需要支持中英文,故默认采用GBK编码格式.因此当把海外环境生成的交易报告单发送给国内的报表系统时, ...

  2. java 验证int长度_java使用注解校验对象属性值数据长度

    java使用注解校验对象属性值数据长度 定义注解 import java.lang.annotation.*; /** * describe:定义注解 * current user Maochao.z ...

  3. java md5 文件验证_Java MD5 文件校验处理

    有两种方式,一种比较优雅,大气,不过对于大文件需要进度条显示的情况不太合适, public String getFileMD5String(File file) throws Exception { ...

  4. java 线程池 源码_java线程池源码分析

    我们在关闭线程池的时候会使用shutdown()和shutdownNow(),那么问题来了: 这两个方法又什么区别呢? 他们背后的原理是什么呢? 线程池中线程超过了coresize后会怎么操作呢? 为 ...

  5. java接口源码_java collection接口源码

    package java.util; /* * 1.Collection接口是集合继承关系中的根接口(root interface),有些集合允许重复元素, * 有些集合有序,JDK不提供本接口的实现 ...

  6. java join 源码_java并发:join源码分析

    join join join是Thread方法,它的作用是A线程中子线程B在运行之后调用了B.join(),A线程会阻塞直至B线程执行结束 join源码(只有继承Thread类才能使用) 基于open ...

  7. java source folder作用_java项目把源码放到folder里,不是source folder,这个java代码还能被调用吗?...

    看到这个问题,真心觉得初学入门就用IDE真心不是一个好方法.IDE屏蔽了太多基础知识,比如Java是需要编译的,运行的是编译后的class文件.编译命令有编译参数,执行命令有执行命令的参数.还有环境变 ...

  8. Java绘画板源码_Java 绘图板 示例源码下载(画板)

    Java 绘图板 示例源码下载(画板) java 2020-8-21 下载地址 https://www.codedown123.com/36795.html package minidrawpad; ...

  9. java单机版软件源码_Java五子棋单机版源码分享

    初学JavaGUI编程,就写了一个小游戏–五子棋. 目前只实现了单机版,任何事情都是从简制作的,有问题请大牛们不吝指教啊. 此处的棋盘和棋子都未用图片,全部都是使用Java中的Graphics画出来的 ...

最新文章

  1. 前端要懂mysql_【灵魂拷问】你真的懂得Mysql的管理和使用吗?
  2. FPGA实现智能小车竞速
  3. LSI系新军搅局,PCIe固态盘混战?
  4. IntelliJ IDEA for Mac的窗口操作
  5. centos安装llvm_Linux CentOS上编译并安装Clang教程
  6. Windows To Ghost系统封装之必备软件集 - 好压
  7. mysql 主键索引如何创建_SQL创建索引、主键
  8. pandas nan判断_【跟着stackoverflow学Pandas】 删除带有NaN的行
  9. [swift] LeetCode 695. Max Area of Island
  10. linux6.5防火墙开端口,Linux(CentOS6.5) 开放端口,配置防火墙
  11. win10 SqlServer2008 卸载 亲测可行
  12. Unity3D入门篇
  13. python ——XML操作
  14. Redis开发运维实践开发者设计规范之延迟考虑
  15. 使用Requests爬取猫眼电影
  16. 优秀的项目跟踪管理软件有哪些?
  17. PASSWORD_VERIFY_FUNCTION(口令复杂性验证)
  18. NDK开发(四):仿QQ变声
  19. 冬至了,该盘点盘点2021年中国企业服务产业了
  20. 旅游企业财务管理【2】

热门文章

  1. 蓝桥平方怪圈 JAVA
  2. 《最强大脑》第八季丨蔡子星邀你一起燃烧大脑!
  3. php获取token失败,如何解决php token验证失败的问题
  4. 5、消防安全重点单位的特有职责
  5. 为什么找APP开发公司不选“北上广”
  6. Page Object 模式很火,UI 自动化测试到底要不要用?怎么用?
  7. 出现提示说vs 正忙
  8. 免费在线app封装 云兔
  9. Directory和DirectoryInfo区别
  10. shutdown 命令