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. 设置使用mac 自带终端记住密码

    厌倦了 mac上每次登录linux服务器或树莓派时总是需要输入用户名和密码. 使用下列方法, 可以减少上述操作. 新建一个 .ssh 文件 vim pi4.ssh 添加如下内容 #!/usr/bin/ ...

  2. 手把手教你如何扩展(破解)mybatisplus的sql生成

    mybatisplus 的常用CRUD方法 众所周知,mybatisplus提供了强大的代码生成能力,他默认生成的常用的CRUD方法(例如插入.更新.删除.查询等)的定义,能够帮助我们节省很多体力劳动 ...

  3. Electron-React18-MacOS桌面管理系统|electron27+react仿mac桌面

    基于React18+Electron27+ArcoDesign仿macOS桌面端系统框架ElectronMacOS. electron-react-macOs 基于electron27.x+vite4 ...

  4. 【python】【报错:pip中第三库下载成功,但是pycharm却没有显示】一步解决

    解决方案: 直接在这个目录下安装第三方库

  5. Opencv实例练习

    实例所用的函数可在另一篇文章查询:  https://www.cnblogs.com/Zhouce/p/17867164.html 1.图像读取 1 import cv2 # 引入opencv库 2 ...

  6. AtCoder_abc329

    AtCoder_abc329 比赛链接 A - Spread A题链接 题目大意 输入一个字符串由大写字母组成的\(S\),输出\(S\)并在每一个字符之间加上空格 解题思路 随便打打就能过.jpg ...

  7. force语句

    类似于assign,用于调试,可以强制给赋值,放在initial后,可以穿透到最内部模块. force (强制赋值操作)与 release(取消强制赋值)表示第二类过程连续赋值语句. 使用方法和效果, ...

  8. 内核模块(.ko) 开发入门

    内核模块时指的是在操作系统内核中动态加载的一段代码,它可以扩展和增强操作系统的功能.内核模块通常用于为操作系统添加新的设备驱动程序.文件系统.网络协议栈等功能. 内核模块是以二进制形式存在的(*.ko ...

  9. 使用kubeadm在Centos8上部署kubernetes1.18

    // 查看系统版本 cat /etc/centos-release CentOS Linux release 8.1.1911 (Core) // 如果系统环境为8.0(云服务器默认最大安装环境为8. ...

  10. CENTOS docker拉取私服镜像

    概述 docker的应用越来越多,安装部署越来越方便,批量自动化的镜像生成和发布都需要docker镜像的拉取. centos6版本太老,docker的使用过程中问题较多,centos7相对简单容易. ...