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>&nbsp; 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>&nbsp; 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>&nbsp; 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>&nbsp; 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>&nbsp; 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>&nbsp; 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>&nbsp; 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>&nbsp; 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>&nbsp; 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>&nbsp; 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>&nbsp; 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>&nbsp; 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的更多相关文章

  1. java CRC16 算法

    代码摘自:https://www.cnblogs.com/lujiannt/p/9246256.html 1.CRC16算法 public class CRC16Util { /** * 计算CRC1 ...

  2. Java CRC16 MODBUS校验算法实现

    /** * CRC校验算法工具类 */ public class CRCUtil { public static String getCRC(String data) { data = data.re ...

  3. C#,Java,C -循环冗余检验:CRC-16-CCITT查表法

    C#代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  4. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  5. CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现

    CRC16算法系列文章: CRC16算法之一:CRC16-CCITT-FALSE算法的java实现 CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三:CR ...

  6. CRC16算法之一:CRC16-CCITT-FALSE算法的java实现

    CRC16算法系列文章: CRC16算法之一:CRC16-CCITT-FALSE算法的java实现 CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三:CR ...

  7. CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现

    CRC16算法系列文章: CRC16算法之一:CRC16-CCITT-FALSE算法的java实现 CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三:CR ...

  8. C++与JAVA代码实现CRC-16/MODBUS算法,且与 http://www.ip33.com/crc.html 进行结果验证

    CRC-16/MODBUS的多项式为:x16+x15+x2+1(8005),宽度为16.运算时,首先将一个16位的寄存器预置为11111111 11111111,然后连续把数据帧中的每个字节中的8位与 ...

  9. 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 ...

  10. CRC16校验

    C++中的代码如下:传入字节(byte)数组引用和数组长度 unsigned short CTcpClient::Crc16(const char *pBuf, unsigned short nLen ...

随机推荐

  1. python之递归(斐波那契数列)与迭代

    对于较大的计算来说,迭代不如递归计算速度快,并且可以说非常慢 但是迭代对于较小的运算又比递归巧妙 # 迭代方法 def slowsnail(x): am = [1, 1] if x < 0: p ...

  2. IDEA提示Cannot resolve class or package ‘beans‘等类似错误

    一.解决方案 1.问题原因: 2.解决: 快捷键:Alt+Enter选择.

  3. Java八股面试题整理(1)

    1.为什么Java代码可以实现一次编写,到处运行? 参考答案 JVM(Java虚拟机)是Java跨平台的关键. 在程序运行前,Java源代码(.java)需要经过编译器编译成字节码(.class).在 ...

  4. jmeter完成文件上传接口

    前提:测试项目中有一个上传本地文件(excel)测被测接口. 测试工具:jmeter 协议:http 测试项目如下图: 第一步:点击模板上传,选择本地excel文件 第二步:上传成功,系统识别exce ...

  5. Java自定义ClassLoader实现插件类隔离加载 - 原理篇

    书接上回 在 Java自定义ClassLoader实现插件类隔离加载文章中,我们通过 自定义ClassLoader + 插件独立打包引入的方式,实现了同依赖不同版本的隔离加载 这次咱们来分析下具体实现 ...

  6. zookeeper JavaApi 创建节点

    import org.apache.curator.RetryPolicy; import org.apache.curator.framework.CuratorFramework; import ...

  7. Java中的并发队列

    1.队列 队列是一种数据结构.它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素(注意不要弄混队列的头部和尾部)就是说,队列以一种先进先出的方式管理数据,如果你试图向一个 已经满了的阻 ...

  8. 【Python微信机器人】第六七篇: 封装32位和64位Python hook框架实战打印微信日志

    目录修整 目前的系列目录(后面会根据实际情况变动): 在windows11上编译python 将python注入到其他进程并运行 注入Python并使用ctypes主动调用进程内的函数和读取内存结构体 ...

  9. minio集群部署

    minio集群部署 1.说明: 安装前需要再添加一个磁盘后将磁盘挂载到/opt/minio目录,minio集群部署需要独占磁盘分区,不能使用文件夹代替. 运行分布式 MinIO 实例的服务器时间差不应 ...

  10. Python 潮流周刊第 33 期(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...