(一文带你玩转CRC)CRC8 CRC16_MODBUS CRC32实现

之前说过了crc计算的基本原理,如有需要请跳转CRC循环冗余校验计算(含c语言实现)icon-default.png?t=N7T8https://blog.csdn.net/m0_57485149/article/details/140658433?spm=1001.2014.3001.5501

通过观察手动计算过程不难发现每次结果最高位为1时都要异或多项式,手动计算时,我们用了最高次幂系数,代码计算时舍去最高次幂系数,所以当判断最高位系数为1时我们都要进行移位操作。手算时crc32后面补32个0,代码时,我们先让八位数据左移24位(让八位数据最变成32位方便异或),在循环中又移八位总共也是32位,等同于加了32个0,依次类推。

当计算crc4时,可以把一个8位数据当成两个四位数据来计算,for循环次数也变成4。

CRC8

获取信息

 第一步 先确定多项式,初始值,初值是否反转,结果是否反转,结果异或值

查询可直接跳转http://www.ip33.com/crc.html

 

由图可以查看到各种信息,多项式去掉最高次幂系数就得到00000111,转换为16进制就是多项式POLY:0x07,初始值为0,结果异或值也为0,输入输出数据皆不反转。 

代码实现

uint8_t crc8(uint8_t * data,uint16_t len)   //crc8 输入不翻转,结果不翻转,初始值为0
{
	uint8_t POLY=0x07;
	uint8_t init=0x00;
	
	while(len--)
	{
		uint8_t i;
		init=init^((*data)<<0);
		for(i=0;i<8;i++)
		{
			if(init&0x80)
			{
				init=(init<<1)^POLY;
			}
			else
			{
				init=(init<<1);
			}
		}
		
		data++;
		
	}
	return init;
}

测试

当有多个数据时

CRC16_MODBUS

获取信息

多项式去掉最高次幂系数得到数据 1000 0000 0000 0101 变为16进制为0x8005

初始值0XFFFF

结果异或0

输出输入皆反转

代码实现

uint16_t crc16_modbus(uint8_t * data,uint16_t len)
{
	uint16_t POLY=0x8005;    //多项式系数去掉最高次幂系数
	uint16_t init=0xFFFF;    //初始值 
	
	while(len--)
	{
		uint8_t i;
		init=init^(InverUint8(*data)<<8);    //InverUint8(*data)初始数据反转
		for(i=0;i<8;i++)
		{
			if(init&0x8000)
			{
				init=(init<<1)^POLY;
			}
			else
			{
				init=(init<<1);
			}
		}
		
		data++;
		
	}
	return InverUint16(init);     //结果反转
}

测试

CRC32

获取信息

各种数据什么意思不再多说,具体方法可看上面

代码实现

uint32_t crc32(uint8_t *data,uint16_t len)
{
	uint32_t POLY=0x04C11DB7;
	uint32_t init=0xFFFFFFFF;
	
	while(len--)
	{
		uint8_t i;
		init=init^(InverUint8(*data)<<24);
		for(i=0;i<8;i++)
		{
			if(init&0x80000000)
			{
				init=(init<<1)^POLY;
			}
			else
			{
				init=(init<<1);
			}
		}
		
		data++;
		
	}
	return (InverUint32(init)^0XFFFFFFFF);
}

测试

补充反转函数实现

crc8

uint8_t InverUint8(uint8_t  data)
{
	uint8_t i;
	uint8_t tem;
	tem=0;
	for(i=0;i<8;i++)
	{
		if(data&(1<<i))      
		{
			tem|=(1<<(7-i));
		}
	}
	return tem;
}

crc16

uint16_t InverUint16(uint16_t  data)
{
	uint8_t i;
	uint16_t tem;
	tem=0;
	for(i=0;i<16;i++)
	{
		if(data&(1<<i))
		{
			tem=tem|(1<<(15-i));
		}
	}
	return tem;
}

crc32 

uint32_t InverUint32(uint32_t  data)
{
	uint8_t i;
	uint32_t tem;
	tem=0;
	for(i=0;i<32;i++)
	{
		if(data&(1<<i))
		{
			tem=tem|(1<<(31-i));
		}
	}
	return tem;
}

  • 40
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark是一个快速通用的集群计算框架,它可以处理大规模数据,并且具有高效的内存计算能力。Spark可以用于各种计算任务,包括批处理、流处理、机器学习等。本文将你了解Spark计算框架的基本概念和使用方法。 一、Spark基础概念 1. RDD RDD(Resilient Distributed Datasets)是Spark的基本数据结构,它是一个分布式的、可容错的、不可变的数据集合。RDD可以从Hadoop、本地文件系统等数据源中读取数据,并且可以通过多个转换操作(如map、filter、reduce等)进行处理。RDD也可以被持久化到内存中,以便下次使用。 2. Spark应用程序 Spark应用程序是由一个驱动程序和多个执行程序组成的分布式计算应用程序。驱动程序是应用程序的主要入口点,它通常位于用户的本地计算机上,驱动程序负责将应用程序分发到执行程序上并收集结果。执行程序是运行在集群节点上的计算单元,它们负责执行驱动程序分配给它们的任务。 3. Spark集群管理器 Spark集群管理器负责管理Spark应用程序在集群中的运行。Spark支持多种集群管理器,包括Standalone、YARN、Mesos等。 二、Spark计算框架使用方法 1. 安装Spark 首先需要安装Spark,可以从Spark官网下载并解压缩Spark安装包。 2. 编写Spark应用程序 编写Spark应用程序通常需要使用Java、Scala或Python编程语言。以下是一个简单的Java代码示例,用于统计文本文件中单词的出现次数: ```java import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import java.util.Arrays; import java.util.Map; public class WordCount { public static void main(String[] args) { SparkConf conf = new SparkConf().setAppName("WordCount").setMaster("local"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> lines = sc.textFile("input.txt"); JavaRDD<String> words = lines.flatMap(line -> Arrays.asList(line.split(" ")).iterator()); Map<String, Long> wordCounts = words.countByValue(); for (Map.Entry<String, Long> entry : wordCounts.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); } sc.stop(); } } ``` 3. 运行Spark应用程序 将编写好的Spark应用程序打包成jar包,并通过以下命令运行: ```bash spark-submit --class WordCount /path/to/wordcount.jar input.txt ``` 其中,--class参数指定应用程序的主类,后面跟上打包好的jar包路径,input.txt是输入文件的路径。 4. 查看运行结果 Spark应用程序运行完毕后,可以查看应用程序的输出结果,例如上述示例中的单词出现次数。 以上就是Spark计算框架的基本概念和使用方法。通过学习Spark,我们可以更好地处理大规模数据,并且提高计算效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值