14:HAL---CRC校验

103系列只有一个CRC

前言:

        CRC(Cyclic Redundancy Check),即循环冗余校验,是一种根据网络数据包或电脑文件等数据产生简短固定位数校核码的快速算法,主要用来检测或校核数据传输或者保存后可能出现的错误。CRC校验的工作原理主要基于以下步骤:

  1. 选定一个标准除数(一个K位二进制数据串)。
  2. 在要发送的数据(m位)后面加上K-1位0,然后将这个新数(M+K-1位)以模2除法的方式除以上面这个标准除数,所得到的余数(余数必须比除数少且只少一位,不够就补0)也就是该数据的CRC校验码。
  3. 将这个校验码附在原m位数据后面,构成新的M+K-1位数据,发送给接收端。
  4. 接收端将接收到的数据除以标准除数,如果余数为0则认为数据正确。

        CRC校验被广泛应用于各种通信协议中,如以太网、USB、串口通信协议等,以及存储介质中,如硬盘、光盘等。在数据传输和存储过程中,由于各种原因(如磁场干扰、光盘划伤等),数据可能会发生错误,CRC校验可以有效地检测并纠正这些错误。

        此外,CRC校验还常用于文件传输、数据库和防篡改检测中。在文件传输过程中,发送方会计算文件的CRC校验码,并将其与文件一同发送给接收方。接收方在接收到文件后,重新计算CRC校验码并与接收到的校验码进行比较,以判断文件是否传输正确。在数据库中,每当数据进行插入、更新或删除操作时,会先计算CRC校验码,并将其与数据一同存储在数据库中。在读取数据时,再次计算CRC校验码并与存储的校验码进行比较,以检测数据是否被篡改。在数据加密中,为了防止被黑客篡改,常常会使用CRC校验技术。

        总之,CRC校验是一种非常有效的数据错误检测和纠正技术,在各种数据传输和存储场景中都有广泛的应用。

一:CRC

CRC种类:CRC8,CRC16,CRC32

CRC8:校验结果为1个字节。

CRC16:校验结果为5个字节。

CRC32:校验结果为4个字节。

在我们整个103系列中只有CRC32的硬件校验。

初始值和多项式:2种通信在确定CRC校验种类后,然后就是确定多项式和初值的一致。

对于我们整个103系列的来说这两个都是固定的值。

多项式:

初值:

二:HAL的配置

 

三:代码

A:硬件CRC单次校验计算

#include "stm32f1xx_hal.h"
#include "rcc.h"
#include "led.h"
#include "delay.h"
#include "UART.h"
#include <stdarg.h>
#include "stdio.h"
#include "CRC.h"


uint32_t verify[4]={0x01020304,0x05060708,0x090A0B0C,0x0D0E0F00};

int main(void)
{

  
	HAL_Init();                         /* 初始化HAL库 */
  sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
  delay_init(72);                     /* 延时初始化 */
  LED_Init();                        /* LED初始化 */
	Uart_Init(115200);
	CRC_Init();
	
	uint32_t inspection_data=HAL_CRC_Calculate(&CRC_Handle,verify,4);
	//因为采用的是硬件CRC32的校验,返回的为4个字节。所以必须采用uint32_t 
	//uint32_t 为4个字节。如果使用其他的那么返回值错误,不是4个字节。
	printf("%x\r\n",inspection_data);
	 while (1)
	 {
			
	 }   
}

#include "stm32f1xx_hal.h"


CRC_HandleTypeDef CRC_Handle;

void CRC_Init(void)
{
	CRC_Handle.Instance=CRC;

	HAL_CRC_Init(&CRC_Handle);
}


void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc)
{

	__HAL_RCC_CRC_CLK_ENABLE();

}

HAL_CRC_Calculate()函数使用注意:

第二个参数:是按字节传输的的(一次4个字节),所以数据从传输检验必须为4字节的整数倍。

uint32_t pBuffer[]:这是一个指向要计算CRC的数据的指针。这个数组包含了要进行CRC计算的数据。由于STM32的CRC算法通常是基于32位数据的,所以这里的数组元素类型通常为uint32_t

我们采用uint32_t 类型的变量占用 4 个字节

第三个参数

  1. uint32_t BufferLength:这个参数指定了pBuffer数组中的元素数量,也就是要计算CRC的数据长度。这个值通常以32位为单位,表示有多少个32位数据需要进行CRC计算。

B:硬件CRC连续计算

        

        当我们的数据量太大的时候,一次性的计算对于我们来说有点困难,或者内存不够。我们采用连续CRC校验的方式(一次校验一个字)。

#include "stm32f1xx_hal.h"
#include "rcc.h"
#include "led.h"
#include "delay.h"
#include "UART.h"
#include <stdarg.h>
#include "stdio.h"
#include "CRC.h"


uint32_t verify[5]={0x01020304,0x05060708,0x090A0B0C,0x0D0E0F00,0x01020304};

int main(void)
{

  
	HAL_Init();                         /* 初始化HAL库 */
  sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
  delay_init(72);                     /* 延时初始化 */
  LED_Init();                        /* LED初始化 */
	Uart_Init(115200);
	CRC_Init();
	
	uint32_t inspection_data=HAL_CRC_Calculate(&CRC_Handle,verify,5);
	//因为采用的是硬件CRC32的校验,返回的为4个字节。所以必须采用uint32_t 
	//uint32_t 为4个字节。如果使用其他的那么返回值错误,不是4个字节。
	printf("单次校验结果=%x\r\n",inspection_data);
	
	
	HAL_CRC_Calculate(&CRC_Handle,&verify[0],1);
	HAL_CRC_Accumulate(&CRC_Handle,&verify[1],1);
	HAL_CRC_Accumulate(&CRC_Handle,&verify[2],1);
	HAL_CRC_Accumulate(&CRC_Handle,&verify[3],1);
	uint32_t Continuous_check=HAL_CRC_Accumulate(&CRC_Handle,&verify[4],1);
	printf("连续校验结果=%x\r\n",Continuous_check);
	 while (1)
	 {
			
	 }   
}

#include "stm32f1xx_hal.h"


CRC_HandleTypeDef CRC_Handle;

void CRC_Init(void)
{
	CRC_Handle.Instance=CRC;

	HAL_CRC_Init(&CRC_Handle);
}


void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc)
{

	__HAL_RCC_CRC_CLK_ENABLE();

}

C:软件CRC校验计算

        软件的CRC校验相对于我们硬件CRC的检验,来说非常灵活,初始值和多项式我们可以自己调节。

#include "stm32f1xx_hal.h"
#include "rcc.h"
#include "led.h"
#include "delay.h"
#include "UART.h"
#include <stdarg.h>
#include "stdio.h"
#include "CRC.h"


uint32_t verify[5]={0x01020304,0x05060708,0x090A0B0C,0x0D0E0F00};
uint8_t software_verify[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
uint32_t res;


int main(void)
{

  
	HAL_Init();                         /* 初始化HAL库 */
  sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
  delay_init(72);                     /* 延时初始化 */
  LED_Init();                        /* LED初始化 */
	Uart_Init(115200);
	CRC_Init();
	
	uint32_t inspection_data=HAL_CRC_Calculate(&CRC_Handle,verify,4);
	//因为采用的是硬件CRC32的校验,返回的为4个字节。所以必须采用uint32_t 
	//uint32_t 为4个字节。如果使用其他的那么返回值错误,不是4个字节。
	printf("硬件单次校验结果=%x\r\n",inspection_data);
	
	
	HAL_CRC_Calculate(&CRC_Handle,&verify[0],1);
	HAL_CRC_Accumulate(&CRC_Handle,&verify[1],1);
	HAL_CRC_Accumulate(&CRC_Handle,&verify[2],1);
	//HAL_CRC_Accumulate(&CRC_Handle,&verify[3],1);
	uint32_t Continuous_check=HAL_CRC_Accumulate(&CRC_Handle,&verify[3],1);
	printf("硬件连续校验结果=%x\r\n",Continuous_check);
	
	
	uint32_t software_data= CRC32(software_verify,16,0XFFFFFFFF);
	
	printf("软件单次校验结果=%x\r\n",software_data);
	
	res=CRC32(&software_verify[0],4,0XFFFFFFFF);
	res=CRC32(&software_verify[4],4,res);
	res=CRC32(&software_verify[8],4,res);
	
	printf("软件连续校验结果=%x\r\n",CRC32(&software_verify[12],4,res));
	
	
	while (1)
	{
			
	} 

  
}

#include "stm32f1xx_hal.h"


CRC_HandleTypeDef CRC_Handle;

void CRC_Init(void)
{
	CRC_Handle.Instance=CRC;

	HAL_CRC_Init(&CRC_Handle);
}


void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc)
{

	__HAL_RCC_CRC_CLK_ENABLE();

}

/**
  * @brief  软件CRC32校验计算
  *         
  * @param  data:校验的数据我们一次校验一个字节
  * @param  len:  检验数据的长度 
  * @param  inti:  检验的初值
  * @retval 返回4个字节的校验数据
  */
uint32_t CRC32(uint8_t *data,uint16_t len,uint32_t init)
{
	//^=异或不同为1
	uint32_t poly=0x04C11DB7; //多项式	
	while(len--)
	{	
		//data<<24:因为CRC32返回去的校验值为4个字节;我们校验的是一个字节;
		//所以把他左移3个字节到最高位。3*8=24也就是左移24位。
		init=init^(*data<<24);
		for(uint8_t i=0;i<8;i++)
		{
			if((init&0x80000000))
			{
					init=(init<<1)^poly;		
			}
			else
			{
				init=(init<<1);
			}
		}
		data++;
	}
	return init;
}

D:软件CRC数据反转

#include "stm32f1xx_hal.h"
#include "rcc.h"
#include "led.h"
#include "delay.h"
#include "UART.h"
#include <stdarg.h>
#include "stdio.h"
#include "CRC.h"


uint32_t verify[5]={0x01020304,0x05060708,0x090A0B0C,0x0D0E0F00};
uint8_t software_verify[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
uint32_t res;


int main(void)
{

  
	HAL_Init();                         /* 初始化HAL库 */
  sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
  delay_init(72);                     /* 延时初始化 */
  LED_Init();                        /* LED初始化 */
	Uart_Init(115200);
	CRC_Init();
	
	uint32_t inspection_data=HAL_CRC_Calculate(&CRC_Handle,verify,4);
	//因为采用的是硬件CRC32的校验,返回的为4个字节。所以必须采用uint32_t 
	//uint32_t 为4个字节。如果使用其他的那么返回值错误,不是4个字节。
	printf("硬件单次校验结果=%x\r\n",inspection_data);
	
	
	HAL_CRC_Calculate(&CRC_Handle,&verify[0],1);
	HAL_CRC_Accumulate(&CRC_Handle,&verify[1],1);
	HAL_CRC_Accumulate(&CRC_Handle,&verify[2],1);
	//HAL_CRC_Accumulate(&CRC_Handle,&verify[3],1);
	uint32_t Continuous_check=HAL_CRC_Accumulate(&CRC_Handle,&verify[3],1);
	printf("硬件连续校验结果=%x\r\n",Continuous_check);
	
	
	uint32_t software_data= CRC32(software_verify,16,0XFFFFFFFF);
	
	printf("软件单次校验结果=%x\r\n",software_data);
	
	
	//软件的输入反转+输出反转的时候不能使用连续的校验;
	//因为在连续的过程种会不只一次的反转输出的结果(一直调用CRC32函数)
	//只有输入反转的时候可以使用
	
//	res=CRC32(&software_verify[0],4,0XFFFFFFFF);
//	res=CRC32(&software_verify[4],4,res);
//	res=CRC32(&software_verify[8],4,res);
//	//res=CRC32(&software_verify[12],4,res);
//	printf("软件连续校验结果=%x\r\n",CRC32(&software_verify[12],4,res));
	
	
	while (1)
	{
			
	} 

  
}
#include "stm32f1xx_hal.h"

uint8_t Inveruint8(uint8_t data);
uint32_t Inveruint32(uint32_t data);

CRC_HandleTypeDef CRC_Handle;

void CRC_Init(void)
{
	CRC_Handle.Instance=CRC;

	HAL_CRC_Init(&CRC_Handle);
}


void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc)
{

	__HAL_RCC_CRC_CLK_ENABLE();

}


/**
  * @brief  软件CRC32校验计算
  *         
  * @param  data:校验的数据我们一次校验一个字节
  * @param  len:  检验数据的长度 
  * @param  inti:  检验的初值
  * @retval 返回4个字节的校验数据
  */
uint32_t CRC32(uint8_t *data,uint16_t len,uint32_t init)
{
	//^=异或不同为1
	uint32_t poly=0x04C11DB7; //多项式	
	while(len--)
	{	
		//data<<24:因为CRC32返回去的校验值为4个字节;我们校验的是一个字节;
		//所以把他左移3个字节到最高位。3*8=24也就是左移24位。
		init=init^(Inveruint8(*data)<<24);   //输入反转
		for(uint8_t i=0;i<8;i++)
		{
			if((init&0x80000000))
			{
					init=(init<<1)^poly;		
			}
			else
			{
				init=(init<<1);
			}
		}
		data++;
	}
	return Inveruint32(init);    //输出反转
}



//数据反转
uint8_t Inveruint8(uint8_t data)
{
	uint8_t i;
	uint8_t temp;
	
	temp=0;
	for(i=0;i<8;i++)
	{
		if(data&(1<<i))
		{
			temp|=1<<(7-i);
		}
	}
	return temp;
}


//数据反转
uint32_t Inveruint32(uint32_t data)
{
	uint8_t i;
	uint32_t temp;
	
	temp=0;
	for(i=0;i<32;i++)
	{
		if(data&(1<<i))
		{
			temp|=1<<(31-i);
		}
	}
	return temp;
}

E:软件的CRC16和CRC8

CRC16

#include "stm32f1xx_hal.h"
#include "rcc.h"
#include "led.h"
#include "delay.h"
#include "UART.h"
#include <stdarg.h>
#include "stdio.h"
#include "CRC.h"


uint32_t verify[5]={0x01020304,0x05060708,0x090A0B0C,0x0D0E0F00};
uint8_t software_verify[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
uint32_t res;


int main(void)
{

  
	HAL_Init();                         /* 初始化HAL库 */
  sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
  delay_init(72);                     /* 延时初始化 */
  LED_Init();                        /* LED初始化 */
	Uart_Init(115200);
	CRC_Init();
	
	uint32_t inspection_data=HAL_CRC_Calculate(&CRC_Handle,verify,4);
	//因为采用的是硬件CRC32的校验,返回的为4个字节。所以必须采用uint32_t 
	//uint32_t 为4个字节。如果使用其他的那么返回值错误,不是4个字节。
	printf("硬件单次校验结果=%x\r\n",inspection_data);
	
	
	HAL_CRC_Calculate(&CRC_Handle,&verify[0],1);
	HAL_CRC_Accumulate(&CRC_Handle,&verify[1],1);
	HAL_CRC_Accumulate(&CRC_Handle,&verify[2],1);
	//HAL_CRC_Accumulate(&CRC_Handle,&verify[3],1);
	uint32_t Continuous_check=HAL_CRC_Accumulate(&CRC_Handle,&verify[3],1);
	printf("硬件连续校验结果=%x\r\n",Continuous_check);
	
	
	uint16_t software_data= CRC16(software_verify,16,0XFFFF);
	
	printf("软件单次校验结果=%x\r\n",software_data);
	
	
	//软件的输入反转+输出反转的时候不能使用连续的校验;
	//因为在连续的过程种会不只一次的反转输出的结果(一直调用CRC32函数)
	//只有输入反转的时候可以使用
	
//	res=CRC32(&software_verify[0],4,0XFFFFFFFF);
//	res=CRC32(&software_verify[4],4,res);
//	res=CRC32(&software_verify[8],4,res);
//	//res=CRC32(&software_verify[12],4,res);
//	printf("软件连续校验结果=%x\r\n",CRC32(&software_verify[12],4,res));
	
	
	while (1)
	{
			
	} 

  
}

#include "stm32f1xx_hal.h"

uint8_t Inveruint8(uint8_t data);
uint32_t Inveruint32(uint32_t data);
uint16_t Inveruint16(uint16_t data);
CRC_HandleTypeDef CRC_Handle;

void CRC_Init(void)
{
	CRC_Handle.Instance=CRC;

	HAL_CRC_Init(&CRC_Handle);
}


void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc)
{

	__HAL_RCC_CRC_CLK_ENABLE();

}


/**
  * @brief  软件CRC32校验计算
  *         
  * @param  data:校验的数据我们一次校验一个字节
  * @param  len:  检验数据的长度 
  * @param  inti:  检验的初值
  * @retval 返回4个字节的校验数据
  */
uint32_t CRC32(uint8_t *data,uint16_t len,uint32_t init)
{
	//^=异或不同为1
	uint32_t poly=0x04C11DB7; //多项式	
	while(len--)
	{	
		//data<<24:因为CRC32返回去的校验值为4个字节;我们校验的是一个字节;
		//所以把他左移3个字节到最高位。3*8=24也就是左移24位。
		init=init^(Inveruint8(*data)<<24);   //输入反转
		for(uint8_t i=0;i<8;i++)
		{
			if((init&0x80000000))
			{
					init=(init<<1)^poly;		
			}
			else
			{
				init=(init<<1);
			}
		}
		data++;
	}
	return Inveruint32(init);    //输出反转
}



/**
  * @brief  软件CRC16校验计算
  *         
  * @param  data:校验的数据我们一次校验一个字节
  * @param  len:  检验数据的长度 
  * @param  inti:  检验的初值
  * @retval 返回4个字节的校验数据
  */
uint16_t CRC16(uint8_t *data,uint16_t len,uint16_t init)
{
	//^=异或不同为1
	uint32_t poly=0x8005; //多项式	
	while(len--)
	{	
		
		init=init^(Inveruint8(*data)<<8);   //输入反转
		for(uint8_t i=0;i<8;i++)
		{
			if((init&0x8000))
			{
					init=(init<<1)^poly;		
			}
			else
			{
				init=(init<<1);
			}
		}
		data++;
	}
	return Inveruint16(init);    //输出反转
}



//数据反转---输入
uint8_t Inveruint8(uint8_t data)
{
	uint8_t i;
	uint8_t temp;
	
	temp=0;
	for(i=0;i<8;i++)
	{
		if(data&(1<<i))
		{
			temp|=1<<(7-i);
		}
	}
	return temp;
}





//数据反转----输出
uint32_t Inveruint32(uint32_t data)
{
	uint8_t i;
	uint32_t temp;
	
	temp=0;
	for(i=0;i<32;i++)
	{
		if(data&(1<<i))
		{
			temp|=1<<(31-i);
		}
	}
	return temp;
}



//数据反转
uint16_t Inveruint16(uint16_t data)
{
	uint8_t i;
	uint16_t temp;
	
	temp=0;
	for(i=0;i<16;i++)
	{
		if(data&(1<<i))
		{
			temp|=1<<(15-i);
		}
	}
	return temp;
}

CRC8

/**
  * @brief  软件CRC8校验计算
  *         
  * @param  data:校验的数据我们一次校验一个字节
  * @param  len:  检验数据的长度 
  * @param  inti:  检验的初值
  * @retval 返回4个字节的校验数据
  */
uint8_t CRC8(uint8_t *data,uint16_t len,uint8_t init)
{
	//^=异或不同为1
	uint32_t poly=0x07; //多项式	
	while(len--)
	{	
		
		init=init^(*data<<8);   
		for(uint8_t i=0;i<8;i++)
		{
			if((init&0x80))
			{
					init=(init<<1)^poly;		
			}
			else
			{
				init=(init<<1);
			}
		}
		data++;
	}
	uint8_t software_data= CRC8(software_verify,16,0XFF);
	
	printf("软件单次校验结果=%x\r\n",software_data);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/614642.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库被攻击后出现1044 - access denied for user ‘root‘@‘% ‘ to database table

MySQL数据库被攻击后&#xff0c;数据库全部被删除&#xff0c;并且加一个一个勒索的数据&#xff0c;向我索要btc&#xff0c; 出现这个问题就是我的数据库密码太简单了&#xff0c;弱密码&#xff0c;被破解了&#xff0c;并且把我权限也给修改了 导致我操作数据库时&#…

HackMyVM-VivifyTech

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 wpscan feroxbuster hydra 提权 系统信息收集 横向渗透 git提权 get root 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:9d:6d:7b, …

PC端与bluetooth蓝牙虚拟串口通信

应该采用RFCOMM虚拟串口方式来进行通信&#xff0c;原理跟socket通信类似&#xff0c;不同的是使用的通信协议不同&#xff0c;本人结合相关的API&#xff0c;做了以下最简单的封装。 1、获取本地蓝牙设备与附近蓝牙设备信息 2、通信类 /* 通信类&#xff1a;只是对于客户端通…

OpenCV的视频 I/O 的标志(77)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; ​ 枚举 枚举 cv::VideoCaptureAPIs { cv::CAP_ANY 0, cv::CAP_VFW 200, cv::CAP_V4L 200, cv::CAP_V4L2 …

增加表空间的数据文件

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 表空间创建完成后&#xff0c;后期还可以为表空间增加数据文件&#xff0c;以扩大数据的存储空间。增加表空间数据文件的基本语法结构如下所示。 ALTER TABLESPACE 表空间名…

反着用scaling law验证数据:群聊场景指代消歧

本文作者&#xff1a;白牛 我们之前开源了 LLM 群聊助手茴香豆&#xff08;以下简称豆哥&#xff09;&#xff0c;它的特点是&#xff1a; 设计了一套拒答 pipeline&#xff0c;实用于群聊场景。能够有效抵抗各种文本攻击、过滤无关话题&#xff0c;累计面对 openmmlab 数千用…

031.下一个排列Java实现

题意 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地&#…

Codeforces Round 944 (Div. 4) A - G

div.4只写部分题解了&#xff0c;都比较基础&#xff0c;数学偏多一点&#xff0c;几乎没有算法&#xff0c;有不懂的欢迎评论区提问&#xff01; A. My First Sorting Problem #include<bits/stdc.h> using namespace std ; typedef long long ll ; const int maxn 2…

return语句

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 return语句 一、return语句后面跟表达式二、return无返回三、return返回的值和函数返回类型不一致四、return语句执行后,后方仍然存在代码五、存在分支语句&#xff0c;需考虑…

ue引擎游戏开发笔记(37)——实现敌人接收攻击伤害,并作出反应

1.需求分析&#xff1a; 现在已经显示造成实际伤害&#xff0c;但敌人对实际伤害并未产生反馈&#xff0c;例如还击&#xff0c;或者死亡倒地等等&#xff0c;实现敌人对于受击的反馈。 2.操作实现&#xff1a; 1.思路&#xff1a;在动画蓝图中添加死亡动画&#xff0c;并通过…

vue阶段案例,练习filter、map、forEach,双向绑定,三元表达式,以及图片滚动,文字跳动等等。

阶段案例 通过案例来练习双向绑定&#xff0c;三元表达式&#xff0c;以及图片滚动&#xff0c;文字跳动等等。 代码如下&#xff1a; <template><table class"bjtp" ><div class"title" >{{title}}</div><div class"s…

人生是旷野,不是轨道

最近看到一句话&#xff0c;很喜欢&#xff0c;分享一下。"人生是旷野&#xff0c;不是轨道"。人生不是固定的方程式&#xff0c;也没有唯一答案&#xff0c;没有谁生来就应该是什么样。别太被太多世俗观念束缚住手脚&#xff0c;每个人都有权利自由生长&#xff0c;…

二叉树进阶 --- 中

目录 1. find 的递归实现 2. insert 的递归实现 3. erase 的递归实现 3.1. 被删除的节点右孩子为空 3.2. 被删除的节点左孩子为空 3.3. 被删除的节点左右孩子都不为空 4. 析构函数的实现 5. copy constructor的实现 6. 赋值运算符重载 7. 搜索二叉树的完整实现 1. fi…

IM 是什么?

在当今数字化的时代&#xff0c;即时通讯&#xff08;IM&#xff09;已经渗透到人们的日常生活和企业的工作环境中。IM技术的快速i发展为人们提供了一种高效、便捷的沟通方式&#xff0c;不仅推动了社会的信息化进程&#xff0c;也提升了企业的协同效率和竞争力。 作为企业级I…

程序环境和预处理、编译链接过程、编译的几个阶段、运行环境、预定义符号等的介绍

文章目录 前言一、程序的翻译环境和执行环境二、编译链接过程三、编译的几个阶段四、运行环境五、预定义符号总结 前言 程序环境和预处理、编译链接过程、编译的几个阶段、运行环境、预定义符号的介绍。 一、程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中&#xff0c…

建模电梯的状态图和学生选课ER图

第一题 尝试建模电梯的状态图&#xff08;选做&#xff09; 第二题 学校规定&#xff1a; 一个学生可选修多门课&#xff0c;一门课有若于学生选修。 一个教师可讲授多门课&#xff0c;一门课只有一个教师讲授。 一个学生选修一门课&#xff0c;仅有一个成绩。 学生的属性有学号…

【力扣】63.不同路径 II

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 目录 1.题目描述 2.思路分析 3.代码实现 1.题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试…

C++11:并发新纪元 —— 深入理解异步编程的力量(1)

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《C11&#xff1a;并发新纪元 —— 深入理解异步编程的力量》&#xff0c;在这篇文章中&#xff0c;你将会学习到C新特性以及异步编程的好处&#xff0c;以及其如何带来的高性能的魅力&…

RabbitMQ(安装配置以及与SpringBoot整合)

文章目录 1.基本介绍2.Linux下安装配置RabbitMQ1.安装erlang环境1.将文件上传到/opt目录下2.进入/opt目录下&#xff0c;然后安装 2.安装RabbitMQ1.进入/opt目录&#xff0c;安装所需依赖2.安装MQ 3.基本配置1.启动MQ2.查看MQ状态3.安装web管理插件4.安装web管理插件超时的解决…

操作系统基础之磁盘

概述 基本概念 磁盘有正反两个盘面&#xff0c;每个盘面有多个同心圆&#xff0c;每个同心圆是一个磁道&#xff0c;每个同心圆又被划分为多个扇区&#xff0c;数据就被存在扇区中。 磁头首先寻找到对应磁道&#xff0c;然后等到磁盘进行周期旋转到指定的扇区&#xff0c;才…