JAVA CRC16
JAVA CRC16
/**
* CRC-16
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>名称</th>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td> CRC-16/IBM</td>
* <td align="center">0x8005</td>
* <td align="center">0x0000</td>
* <td align="center">0x0000</td>
* <td align="center">LSB First</td>
* </tr>
* <tr>
* <td> CRC-16/CCITT</td>
* <td align="center">0x1021</td>
* <td align="center">0x0000</td>
* <td align="center">0x0000</td>
* <td align="center">LSB First</td>
* </tr>
* <tr>
* <td> CRC-16/CCITT-FALSE</td>
* <td align="center">0x1021</td>
* <td align="center">0xFFFF</td>
* <td align="center">0x0000</td>
* <td align="center">MSB First</td>
* </tr>
* <tr>
* <td> CRC-16/DECT R</td>
* <td align="center">0x0589</td>
* <td align="center">0x0000</td>
* <td align="center">0x0001</td>
* <td align="center">MSB First</td>
* </tr>
* <tr>
* <td> CRC-16/DECT X</td>
* <td align="center">0x0589</td>
* <td align="center">0x0000</td>
* <td align="center">0x0000</td>
* <td align="center">MSB First</td>
* </tr>
* <tr>
* <td> CRC-16/DNP</td>
* <td align="center">0x3D65</td>
* <td align="center">0x0000</td>
* <td align="center">0xFFFF</td>
* <td align="center">LSB First</td>
* </tr>
* <tr>
* <td> CRC-16/GENIBUS</td>
* <td align="center">0x1021</td>
* <td align="center">0xFFFF</td>
* <td align="center">0xFFFF</td>
* <td align="center">MSB First</td>
* </tr>
* <tr>
* <td> CRC-16/MAXIM</td>
* <td align="center">0x8005</td>
* <td align="center">0x0000</td>
* <td align="center">0xFFFF</td>
* <td align="center">LSB First</td>
* </tr>
* <tr>
* <td> CRC-16/MODBUS</td>
* <td align="center">0x8005</td>
* <td align="center">0xFFFF</td>
* <td align="center">0x0000</td>
* <td align="center">LSB First</td>
* </tr>
* <tr>
* <td> CRC-16/USB</td>
* <td align="center">0x8005</td>
* <td align="center">0xFFFF</td>
* <td align="center">0xFFFF</td>
* <td align="center">LSB First</td>
* </tr>
* <tr>
* <td> CRC-16/X25</td>
* <td align="center">0x1021</td>
* <td align="center">0xFFFF</td>
* <td align="center">0xFFFF</td>
* <td align="center">LSB First</td>
* </tr>
* <tr>
* <td> CRC-16/XMODEM</td>
* <td align="center">0x1021</td>
* <td align="center">0x0000</td>
* <td align="center">0x0000</td>
* <td align="center">MSB First</td>
* </tr>
* </table>
*
* @author unnamed
*
*/
public class CRC16Utils { /**
* CRC-16/IBM
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x8005</td>
* <td align="center">0x0000</td>
* <td align="center">0x0000</td>
* <td align="center">LSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC16_IBM(byte[] source, int offset, int length) {
int wCRCin = 0x0000;
// Integer.reverse(0x8005) >>> 16
int wCPoly = 0xA001;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
wCRCin ^= ((int) source[i] & 0x00FF);
for (int j = 0; j < 8; j++) {
if ((wCRCin & 0x0001) != 0) {
wCRCin >>= 1;
wCRCin ^= wCPoly;
} else {
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0x0000;
} /**
* CRC-16/CCITT
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x1021</td>
* <td align="center">0x0000</td>
* <td align="center">0x0000</td>
* <td align="center">LSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC16_CCITT(byte[] source, int offset, int length) {
int wCRCin = 0x0000;
// Integer.reverse(0x1021) >>> 16
int wCPoly = 0x8408;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
wCRCin ^= ((int) source[i] & 0x00FF);
for (int j = 0; j < 8; j++) {
if ((wCRCin & 0x0001) != 0) {
wCRCin >>= 1;
wCRCin ^= wCPoly;
} else {
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0x0000;
} /**
* CRC-16/CCITT-FALSE
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x1021</td>
* <td align="center">0xFFFF</td>
* <td align="center">0x0000</td>
* <td align="center">MSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC16_CCITT_FALSE(byte[] source, int offset, int length) {
int wCRCin = 0xFFFF;
int wCPoly = 0x1021;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
for (int j = 0; j < 8; j++) {
boolean bit = ((source[i] >> (7 - j) & 1) == 1);
boolean c15 = ((wCRCin >> 15 & 1) == 1);
wCRCin <<= 1;
if (c15 ^ bit)
wCRCin ^= wCPoly;
}
}
wCRCin &= 0xFFFF;
return wCRCin ^= 0x0000;
} /**
* CRC-16/DECT R
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x0589</td>
* <td align="center">0x0000</td>
* <td align="center">0x0001</td>
* <td align="center">MSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC16_DECT_R(byte[] source, int offset, int length) {
int wCRCin = 0x0000;
int wCPoly = 0x0589;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
for (int j = 0; j < 8; j++) {
boolean bit = ((source[i] >> (7 - j) & 1) == 1);
boolean c15 = ((wCRCin >> 15 & 1) == 1);
wCRCin <<= 1;
if (c15 ^ bit)
wCRCin ^= wCPoly;
}
}
wCRCin &= 0xFFFF;
return wCRCin ^= 0x0001;
} /**
* CRC-16/DECT X
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x0589</td>
* <td align="center">0x0000</td>
* <td align="center">0x0000</td>
* <td align="center">MSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC16_DECT_X(byte[] source, int offset, int length) {
int wCRCin = 0x0000;
int wCPoly = 0x0589;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
for (int j = 0; j < 8; j++) {
boolean bit = ((source[i] >> (7 - j) & 1) == 1);
boolean c15 = ((wCRCin >> 15 & 1) == 1);
wCRCin <<= 1;
if (c15 ^ bit)
wCRCin ^= wCPoly;
}
}
wCRCin &= 0xFFFF;
return wCRCin ^= 0x0000;
} /**
* CRC-16/DNP
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x3D65</td>
* <td align="center">0x0000</td>
* <td align="center">0xFFFF</td>
* <td align="center">LSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC16_DNP(byte[] source, int offset, int length) {
int wCRCin = 0x0000;
// Integer.reverse(0x3D65) >>> 16
int wCPoly = 0xA6BC;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
wCRCin ^= ((int) source[i] & 0x00FF);
for (int j = 0; j < 8; j++) {
if ((wCRCin & 0x0001) != 0) {
wCRCin >>= 1;
wCRCin ^= wCPoly;
} else {
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0xFFFF;
} /**
* CRC-16/GENIBUS
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x1021</td>
* <td align="center">0xFFFF</td>
* <td align="center">0xFFFF</td>
* <td align="center">MSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC16_GENIBUS(byte[] source, int offset, int length) {
int wCRCin = 0xFFFF;
int wCPoly = 0x1021;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
for (int j = 0; j < 8; j++) {
boolean bit = ((source[i] >> (7 - j) & 1) == 1);
boolean c15 = ((wCRCin >> 15 & 1) == 1);
wCRCin <<= 1;
if (c15 ^ bit)
wCRCin ^= wCPoly;
}
}
wCRCin &= 0xFFFF;
return wCRCin ^= 0xFFFF;
} /**
* CRC-16/MAXIM
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x8005</td>
* <td align="center">0x0000</td>
* <td align="center">0xFFFF</td>
* <td align="center">LSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC16_MAXIM(byte[] source, int offset, int length) {
int wCRCin = 0x0000;
// Integer.reverse(0x8005) >>> 16
int wCPoly = 0xA001;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
wCRCin ^= ((int) source[i] & 0x00FF);
for (int j = 0; j < 8; j++) {
if ((wCRCin & 0x0001) != 0) {
wCRCin >>= 1;
wCRCin ^= wCPoly;
} else {
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0xFFFF;
} /**
* CRC-16/MODBUS
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x8005</td>
* <td align="center">0xFFFF</td>
* <td align="center">0x0000</td>
* <td align="center">LSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC16_MODBUS(byte[] source, int offset, int length) {
int wCRCin = 0xFFFF;
// Integer.reverse(0x8005) >>> 16
int wCPoly = 0xA001;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
wCRCin ^= ((int) source[i] & 0x00FF);
for (int j = 0; j < 8; j++) {
if ((wCRCin & 0x0001) != 0) {
wCRCin >>= 1;
wCRCin ^= wCPoly;
} else {
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0x0000;
} /**
* CRC-16/USB
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x8005</td>
* <td align="center">0xFFFF</td>
* <td align="center">0xFFFF</td>
* <td align="center">LSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC16_USB(byte[] source, int offset, int length) {
int wCRCin = 0xFFFF;
// Integer.reverse(0x8005) >>> 16
int wCPoly = 0xA001;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
wCRCin ^= ((int) source[i] & 0x00FF);
for (int j = 0; j < 8; j++) {
if ((wCRCin & 0x0001) != 0) {
wCRCin >>= 1;
wCRCin ^= wCPoly;
} else {
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0xFFFF;
} /**
* CRC-16/X25
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x1021</td>
* <td align="center">0xFFFF</td>
* <td align="center">0xFFFF</td>
* <td align="center">LSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC16_X25(byte[] source, int offset, int length) {
int wCRCin = 0xFFFF;
// Integer.reverse(0x1021) >>> 16
int wCPoly = 0x8408;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
wCRCin ^= ((int) source[i] & 0x00FF);
for (int j = 0; j < 8; j++) {
if ((wCRCin & 0x0001) != 0) {
wCRCin >>= 1;
wCRCin ^= wCPoly;
} else {
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0xFFFF;
} /**
* CRC-16/XMODEM
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x1021</td>
* <td align="center">0x0000</td>
* <td align="center">0x0000</td>
* <td align="center">MSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC16_XMODEM(byte[] source, int offset, int length) {
int wCRCin = 0x0000;
int wCPoly = 0x1021;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
for (int j = 0; j < 8; j++) {
boolean bit = ((source[i] >> (7 - j) & 1) == 1);
boolean c15 = ((wCRCin >> 15 & 1) == 1);
wCRCin <<= 1;
if (c15 ^ bit)
wCRCin ^= wCPoly;
}
}
wCRCin &= 0xFFFF;
return wCRCin ^= 0x0000;
} }
转:https://blog.csdn.net/zte1055889498/article/details/102686777
JAVA CRC16的更多相关文章
- java CRC16 算法
代码摘自:https://www.cnblogs.com/lujiannt/p/9246256.html 1.CRC16算法 public class CRC16Util { /** * 计算CRC1 ...
- Java CRC16 MODBUS校验算法实现
/** * CRC校验算法工具类 */ public class CRCUtil { public static String getCRC(String data) { data = data.re ...
- C#,Java,C -循环冗余检验:CRC-16-CCITT查表法
C#代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现
CRC16算法系列文章: CRC16算法之一:CRC16-CCITT-FALSE算法的java实现 CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三:CR ...
- CRC16算法之一:CRC16-CCITT-FALSE算法的java实现
CRC16算法系列文章: CRC16算法之一:CRC16-CCITT-FALSE算法的java实现 CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三:CR ...
- CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现
CRC16算法系列文章: CRC16算法之一:CRC16-CCITT-FALSE算法的java实现 CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三:CR ...
- C++与JAVA代码实现CRC-16/MODBUS算法,且与 http://www.ip33.com/crc.html 进行结果验证
CRC-16/MODBUS的多项式为:x16+x15+x2+1(8005),宽度为16.运算时,首先将一个16位的寄存器预置为11111111 11111111,然后连续把数据帧中的每个字节中的8位与 ...
- CRC-16/XMODE X16+X12+X5+1 C#、C和java环境下实现
private byte[] CRC(byte[] x, int len) //CRC校验函数 { ]; UInt16 crc = ; byte da; ; UInt16[] yu = { 0x000 ...
- CRC16校验
C++中的代码如下:传入字节(byte)数组引用和数组长度 unsigned short CTcpClient::Crc16(const char *pBuf, unsigned short nLen ...
随机推荐
- UIPath动态操作控制
如果放弃太早,你永远都不知道自己会错过什么. 一.浏览器 打开浏览器:OpenBrowser: 关闭浏览器:Close Tab.Close Application.Kill Process: 二. 鼠 ...
- GeminiDB新特性:让Redis广告频控爱不释手的exHASH
本文分享自华为云社区<GeminiDB新特性:让Redis广告频控爱不释手的exHASH>,作者:GeminiDB-Redis博客 . exHash类型是一种支持Field过期的新型数据类 ...
- 【Javascript】什么是alert,alert怎么用
alert()是javascript语言提供的一个警告框函数 他可以接受任意参数,参数就是警告框里的函数信息
- 【Javaweb】Servlet五 | HTTP协议【详解】
什么是HTTP协议 什么是协议? 协议是指双方或多方相互约定好,大家都需要遵守的规则,叫协议. 所谓HTTP协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫做HTTP协议. HT ...
- Aiganize微信小程序开发手册二代
根据此表格, 现有三个模块: 活动模块 聊天模块 影子模块 现活动模块交与:赵坤亮.郝文章做 现聊天模块与用户信息交与:葛方杰.陈金鹏做影子模块待定,现做完那两块,已经有不错的用户体验了.
- 文心一言 VS 讯飞星火 VS chatgpt (153)-- 算法导论12.2 9题
九.用go语言,设 T 是一棵二叉搜索树,其关键字互不相同;设 x 是一个叶结点,y 为其父结点.证明: y.key 或者是 T 树中大于 x.key 的最小关键字,或者是 T 树中小于 x.key ...
- [c/c++][考研复习笔记]内部排序篇学习笔记
考研排序复习笔记 插入排序 #include<stdio.h> #include<stdlib.h> #define MaxSize 9 //折半插入排序 void ZBIns ...
- 微调baichuan2-7b遇到的显存坑
问题描述: 微调baichuan2-7b模型,验证一轮后继续训练第一个iteration显存大幅增加 项目链接: https://github.com/wp931120/baichuan_sft_lo ...
- MD5 or Bcrypt?
MD5 or Bcrypt? 摘要 首先是一个错误的认识观念问题,很多人觉得MD5是一个加密算法.不然,他实则是一种摘要算法,也可以叫哈希函数.他的作用是将目标文本转换成具有相同长度.不可逆的杂凑字符 ...
- Python——第二章:字符串操作——索引和切片
索引: 按照位置提取元素 可以采用索引的方式来提取某一个字符(文字) s = "我叫周杰伦" print(s[3]) #程序员都是从0开始数,这里的3代表第4位,也就是" ...