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. JavaScript 简介与引用

    作者:WangMin 格言:努力做好自己喜欢的每一件事 我们通常写好的HTML网页是处于一个静态的效果,在用户体验这一方面就不是很好,给人一种死板的感觉.这里我们就可以用到JavaScript来为网页 ...

  2. Educational Codeforces Round 118 (Rated for Div. 2) D. MEX Sequences

    \(DP\)真的太难了啊!! 首先考虑到\(f(i, s)\)表示,从前\(i\)个数中选,最后一个数为\(a_i\),且\(MEX(a_1,....,a_i) = \left\{ \begin{al ...

  3. Educational Codeforces Round 125 (Rated for Div. 2) E. Star MST

    折磨了我三天的\(DP\),终于看懂啦. 首先,如果想要有题目要求的效果,那么最短的边一定都是与\(1\)相连的,就是一个菊花图,生成树里的边就是最短的边. \(f[i][j]\)表示已经有\(i\) ...

  4. 使用DHorse发布SpringBoot项目到K8S

    前言 在介绍DHorse的操作之前,先来介绍一下使用k8s发布应用的步骤,以SpringBoot应用为例进行说明. 1.首先从代码仓库下载代码,比如GitLab: 2.接着进行构建,比如使用Maven ...

  5. C#/.NET/.NET Core推荐学习书籍(已分类)

    前言 古人云:"书中自有黄金屋,书中自有颜如玉",说明了书籍的重要性.作为程序员,我们需要不断学习以提升自己的核心竞争力.以下是一些优秀的C#/.NET/.NET Core相关学习 ...

  6. 2023-12-02:用go语言,如何求模立方根? x^3=a mod p, p是大于等于3的大质数, a是1到p-1范围的整数常数, x也是1到p-1范围的整数,求x。 p过大,x不能从1到p-1遍

    2023-12-02:用go语言,如何求模立方根? x^3=a mod p, p是大于等于3的大质数, a是1到p-1范围的整数常数, x也是1到p-1范围的整数,求x. p过大,x不能从1到p-1遍 ...

  7. 【开源项目推荐】-支持GPT的智能数据库客户端与报表工具——Chat2DB

    2023年是人工智能爆火的一年,ChatGPT为首的一系列的大模型的出现,让生成式人工智能彻底火了一把.但有人会说,GPT对于我们数据开发来说并没有什么作用啊? 今天为大家推荐的开源项目,就是GPT在 ...

  8. 记一次 .NET 某药厂业务系统 CPU爆高分析

    一:背景 1. 讲故事 前段时间有位朋友找到我,说他们的程序出现了CPU爆高,让我帮忙看下怎么回事?这种问题好的办法就是抓个dump丢给我,推荐的工具就是用 procdump 自动化抓捕. 二:Win ...

  9. Redis全文搜索教程之创建索引并关联源数据

    Redis 全文搜索是依赖于 Redis 官方提供的 RediSearch 来实现的.RediSearch 提供了一种简单快速的方法对 hash 或者 json 类型数据的任何字段建立二级索引,然后就 ...

  10. 使用汇编和反汇编引擎写一个x86任意地址hook

    最简单的Hook 刚开始学的时候,用的hook都是最基础的5字节hook,也不会使用hook框架,hook流程如下: 构建一个jmp指令跳转到你的函数(函数需定义为裸函数) 保存被hook地址的至少5 ...