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. 巅峰对决:英伟达 V100、A100/800、H100/800 GPU 对比

    近期,不论是国外的 ChatGPT,还是国内诸多的大模型,让 AIGC 的市场一片爆火.而在 AIGC 的种种智能表现背后,均来自于堪称天文数字的算力支持.以 ChatGPT 为例,据微软高管透露,为 ...

  2. FDA周五发布的药物安全警示信息相对会较少地被媒体传播

    The Friday Effect: Firm Lobbying, the Timing of Drug Safety Alerts, and Drug Side Effects 周五发布的药物安全警 ...

  3. Java Lambda 表达式常见面试问题与解答

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 在本文中,我们将讨论一些重要且常见的 Java Lambda 表达式面试问题和解答 1.什么是 Lambda 表达式? l ...

  4. (Good topic)四因数 (leetcode 181周赛T2)

     四因数难度中等1收藏分享切换为英文关注反馈给你一个整数数组 nums,请你返回该数组中恰有四个因数的这些整数的各因数之和. 如果数组中不存在满足题意的整数,则返回 0 .   示例: 输入:nums ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (139)-- 算法导论11.4 3题

    三.用go语言,考虑一个采用均匀散列的开放寻址散列表.当装载因子为 3/4 和 7/8 时,试分别给出一次不成功查找和一次成功查找的探查期望数上界. 文心一言: 在开放寻址法中,当散列表的装载因子超过 ...

  6. 在Vue中使用Mock.js虚拟接口数据实例详解

    在Vue项目中使用Mock.js可以方便地模拟接口数据,用于前端开发和测试.Mock.js是一个生成随机数据的库,可以帮助我们快速构建虚拟接口数据.在本文中,我将通过一个实例来详细讲解在Vue中使用M ...

  7. 后台获取的map集合封装json

    let list = [] let arr = {'a':'1','b':'2','c':'3','d':'4'} for(var key in arr){ console.log("key ...

  8. Codeforces Round 894 (Div. 3)

    Codeforces Round 894 (Div. 3) A. Gift Carpet 题意:判断一列一个字母有没有"vika" 思路:挨个枚举每一列 #include<b ...

  9. 三分钟使用github的技巧

    一.GitHub搜索技巧--找开发者 搜索条件 备注 location: location:china,匹配用户填写的地址在china language: language:javascript,匹配 ...

  10. 神经网络入门篇:详解参数VS超参数(Parameters vs Hyperparameters)

    参数 VS 超参数 什么是超参数? 比如算法中的learning rate \(a\)(学习率).iterations(梯度下降法循环的数量).\(L\)(隐藏层数目).\({{n}^{[l]}}\) ...