Java CRC8

/**
* CRC-8
*
* <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-8</td>
* <td align="center">0x07</td>
* <td align="center">0x00</td>
* <td align="center">0x00</td>
* <td align="center">MSB First</td>
* </tr>
* <tr>
* <td>&nbsp; CRC-8/DARC</td>
* <td align="center">0x39</td>
* <td align="center">0x00</td>
* <td align="center">0x00</td>
* <td align="center">LSB First</td>
* </tr>
* <tr>
* <td>&nbsp; CRC-8/ITU</td>
* <td align="center">0x07</td>
* <td align="center">0x00</td>
* <td align="center">0x55</td>
* <td align="center">MSB First</td>
* </tr>
* <tr>
* <td>&nbsp; CRC-8/MAXIM</td>
* <td align="center">0x31</td>
* <td align="center">0x00</td>
* <td align="center">0x00</td>
* <td align="center">LSB First</td>
* </tr>
* <tr>
* <td>&nbsp; CRC-8/ROHC</td>
* <td align="center">0x07</td>
* <td align="center">0xFF</td>
* <td align="center">0x00</td>
* <td align="center">LSB First</td>
* </tr>
* </table>
*
* @author unnamed
*
*/
public class CRC8Utils { /**
* CRC-8
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x07</td>
* <td align="center">0x00</td>
* <td align="center">0x00</td>
* <td align="center">MSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC8(byte[] source, int offset, int length) {
int wCRCin = 0x00;
int wCPoly = 0x07;
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 c07 = ((wCRCin >> 7 & 1) == 1);
wCRCin <<= 1;
if (c07 ^ bit)
wCRCin ^= wCPoly;
}
}
wCRCin &= 0xFF;
return wCRCin ^= 0x00;
} /**
* CRC-8/DARC
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x39</td>
* <td align="center">0x00</td>
* <td align="center">0x00</td>
* <td align="center">LSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC8_DARC(byte[] source, int offset, int length) {
int wCRCin = 0x00;
// Integer.reverse(0x39) >>> 24
int wCPoly = 0x9C;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
wCRCin ^= ((long) source[i] & 0xFF);
for (int j = 0; j < 8; j++) {
if ((wCRCin & 0x01) != 0) {
wCRCin >>= 1;
wCRCin ^= wCPoly;
} else {
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0x00;
} /**
* CRC-8/ITU
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x07</td>
* <td align="center">0x00</td>
* <td align="center">0x55</td>
* <td align="center">MSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC8_ITU(byte[] source, int offset, int length) {
int wCRCin = 0x00;
int wCPoly = 0x07;
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 c07 = ((wCRCin >> 7 & 1) == 1);
wCRCin <<= 1;
if (c07 ^ bit)
wCRCin ^= wCPoly;
}
}
wCRCin &= 0xFF;
return wCRCin ^= 0x55;
} /**
* CRC-8/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">0x31</td>
* <td align="center">0x00</td>
* <td align="center">0x00</td>
* <td align="center">LSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC8_MAXIM(byte[] source, int offset, int length) {
int wCRCin = 0x00;
// Integer.reverse(0x31) >>> 24
int wCPoly = 0x8C;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
wCRCin ^= ((long) source[i] & 0xFF);
for (int j = 0; j < 8; j++) {
if ((wCRCin & 0x01) != 0) {
wCRCin >>= 1;
wCRCin ^= wCPoly;
} else {
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0x00;
} /**
* CRC-8/ROHC
*
* <table width="400px" border="1" cellpadding="0" cellspacing="0">
* <tr>
* <th>多项式</th>
* <th>初始值</th>
* <th>异或值</th>
* <th>Bit反转</th>
* </tr>
* <tr>
* <td align="center">0x07</td>
* <td align="center">0xFF</td>
* <td align="center">0x00</td>
* <td align="center">LSB First</td>
* </tr>
* </table>
*
* @param source
* @param offset
* @param length
* @return
*/
public static int CRC8_ROHC(byte[] source, int offset, int length) {
int wCRCin = 0xFF;
// Integer.reverse(0x07) >>> 24
int wCPoly = 0xE0;
for (int i = offset, cnt = offset + length; i < cnt; i++) {
wCRCin ^= ((long) source[i] & 0xFF);
for (int j = 0; j < 8; j++) {
if ((wCRCin & 0x01) != 0) {
wCRCin >>= 1;
wCRCin ^= wCPoly;
} else {
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0x00;
} }

转:https://blog.csdn.net/zte1055889498/article/details/102785410

JAVA CRC8的更多相关文章

  1. Spark案例分析

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

  2. Java获取字符串的CRC8校验码(由C程序的代码修改为了Java代码)

    CRC8算法请百度,我也不懂,这里只是把自己运行成功的结构贴出来了.方法CRC8_Tab这里没有处理,因为我的程序中没有用到. package com.crc; public class CCRC8_ ...

  3. CRC32 vs Java.HashCode

    找了容量为27万中文词库进行试验    CRC32 中冲突率 < 0.01%    而 Java.HashCode 有 4%    hashCode 的速度 应该比 CRC 快 2-3 倍 CR ...

  4. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  5. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  6. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

  7. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  8. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  9. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  10. Java多线程基础学习(二)

    9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...

随机推荐

  1. 邮差之死--python源代码

    """sth imported""" import time import os '''2 flags''' flag = 0 tmp = ...

  2. 关于MM32F001无法debug的问题

    以下问题仅来自于个人的调试发现和猜测, 并不代表芯片有任何问题. 实际上我也仅仅是试用了一下. 主要发现芯片总是被锁住(FLASH被写保护?),具体如下: (1) 内存溢出时芯片被写保护, 导致再次d ...

  3. JavaScript高级程序设计笔记03 语言基础

    语言基础 主要基于ES6. 一切都区分大小写.无论变量.函数名还是操作符 标识符 变量名.函数名.属性名.参数名 可由一个或多个字符组成: 第一个必须是字母._或者$: 其余的可以是字母._.$或者数 ...

  4. python在使用过程中安装库的方法

    背景: 在学习python的过程中难免会出现python解释器中没有所需要的库,这时我们就要自行的去安装这些库了:当然如果使用的anaconda集成环境的话在安装python一些依赖环境中会简单不少( ...

  5. 如何基于 k8s做私有化部署

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 随着国内数字化转型的加速和国产化进程推动,软件系统的私有化部署已经成为非常热门的话题,因为私有化部署赋予了企业更大的灵活和 ...

  6. Diffusion Model扩散模型

    1.扩散模型基本原理: 扩散模型包括两个步骤: 固定的(或预设的)前向扩散过程q:该过程会逐渐将高斯噪声添加到图像中,直到最终得到纯噪声. 2.可训练的反向去噪扩散过程pθ:训练一个神经网络,从纯噪音 ...

  7. 操作系统大作业:在Linux环境下模拟实现简单命令解释器(代码部分)

    好家伙   1. 题目要求 一.   课程设计(大作业)目的 熟悉Linux编程环境,加强对Linux命令的理解及函数的运用,完成一个操作系统的部分系统的设计过程.编码.调试,锻炼实际应用能力. 二. ...

  8. 【UniApp】-uni-app-打包成小程序

    前言 大家好,我是 BNTang, 在上一节文章中,我给大家详细的介绍了如何将我开发好的项目打包为网页. 趁热打铁,在来一篇文章,给大家详细的介绍如何将项目打包为小程序. 正文 打开微信小程序呢,其实 ...

  9. Postgres服务器操作方法

    切换用户 sudo su postgres psql postgres 查询当前postgres下的DB列表 \l 查看postgres下角色的详细信息(权限) \du 删除odoo角色 drop r ...

  10. vscode下载

    vscode下载 想下载官网可以直接去官网下载(速度超慢~) 百度网盘链接: 链接:https://pan.baidu.com/s/14DfWI5b2HA_J_kHBcu8JQw?pwd=yyds 提 ...