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 ...
随机推荐
- python之递归(斐波那契数列)与迭代
对于较大的计算来说,迭代不如递归计算速度快,并且可以说非常慢 但是迭代对于较小的运算又比递归巧妙 # 迭代方法 def slowsnail(x): am = [1, 1] if x < 0: p ...
- IDEA提示Cannot resolve class or package ‘beans‘等类似错误
一.解决方案 1.问题原因: 2.解决: 快捷键:Alt+Enter选择.
- Java八股面试题整理(1)
1.为什么Java代码可以实现一次编写,到处运行? 参考答案 JVM(Java虚拟机)是Java跨平台的关键. 在程序运行前,Java源代码(.java)需要经过编译器编译成字节码(.class).在 ...
- jmeter完成文件上传接口
前提:测试项目中有一个上传本地文件(excel)测被测接口. 测试工具:jmeter 协议:http 测试项目如下图: 第一步:点击模板上传,选择本地excel文件 第二步:上传成功,系统识别exce ...
- Java自定义ClassLoader实现插件类隔离加载 - 原理篇
书接上回 在 Java自定义ClassLoader实现插件类隔离加载文章中,我们通过 自定义ClassLoader + 插件独立打包引入的方式,实现了同依赖不同版本的隔离加载 这次咱们来分析下具体实现 ...
- zookeeper JavaApi 创建节点
import org.apache.curator.RetryPolicy; import org.apache.curator.framework.CuratorFramework; import ...
- Java中的并发队列
1.队列 队列是一种数据结构.它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素(注意不要弄混队列的头部和尾部)就是说,队列以一种先进先出的方式管理数据,如果你试图向一个 已经满了的阻 ...
- 【Python微信机器人】第六七篇: 封装32位和64位Python hook框架实战打印微信日志
目录修整 目前的系列目录(后面会根据实际情况变动): 在windows11上编译python 将python注入到其他进程并运行 注入Python并使用ctypes主动调用进程内的函数和读取内存结构体 ...
- minio集群部署
minio集群部署 1.说明: 安装前需要再添加一个磁盘后将磁盘挂载到/opt/minio目录,minio集群部署需要独占磁盘分区,不能使用文件夹代替. 运行分布式 MinIO 实例的服务器时间差不应 ...
- Python 潮流周刊第 33 期(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...