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)
{//^=异或不同为1uint32_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)
{//^=异或不同为1uint32_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)
{//^=异或不同为1uint32_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)
{//^=异或不同为1uint32_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)
{//^=异或不同为1uint32_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);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QX---mini51单片机学习---(8)8*8点阵屏

目录 1LED点阵屏简绍 2 8*8点阵屏电路图74 3 74HC595芯片 4实践编程 1LED点阵屏简绍 2 8*8点阵屏电路图74 怎么点亮&#xff0c;正极给高负极给低 不能同时静态显示&#xff0c;跟数码管动态显示一样&#xff0c;反复横跳&#xff0c;利用视觉效果 3 74HC595芯片 …

斐波那契数

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 …

第四届上海理工大学程序设计全国挑战赛---昨日方舟

知识点&#xff1a;模拟 题目描述 《昨日方舟》是一款塔防类游戏。在游戏中&#xff0c;我们要通过部署角色来抵御怪物的入侵。在这款游戏中&#xff0c;有一名角色名字为 “今”&#xff0c;他的能力为能够在地图上部署小蛇&#xff0c;小蛇在某些条件下可以与其他小蛇合体…

关于 IIS 开启匿名访问网站仍要账号密码登录网站的解决方法

欢迎关注公总号【云边小网安】 问题提出&#xff1a;发现虽然勾选了允许匿名访问网站&#xff0c;但在访问某一网站的时候仍然需要登录账号密码 解决方法一&#xff1a;登录管理员账号密码解决方法二&#xff1a;添加访问网站文件夹的用户 访问某一网站本质上来讲&#xff0…

C++入门必读-Qt的安装与配置

QT简介 Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 QT下载 访问下载网站: Index of /archive/qt 安装编译器 QT安装 建议安装之前将网络断…

1064 朋友数

solution 给出n个整数&#xff0c;统计可能的位数和&#xff0c;并按升序输出&#xff08;考虑用set实现&#xff09; #include<iostream> #include<set> using namespace std; int main(){set<int> st;int n, x, sum;scanf("%d", &n);while…

前端Vue架构

1 理解&#xff1a; 创建视图的函数&#xff08;render&#xff09;和数据之间的关联&#xff1b; 当数据发生变化的时候&#xff0c;希望render重新执行&#xff1b; 监听数据的读取和修改&#xff1b; defineProperty&#xff1a;监听范围比较窄&#xff0c;只能通过属性描…

Docker 直接运行一个 Alpine 镜像

由于镜像很小&#xff0c;下载时间往往很短&#xff0c;读者可以直接使用 docker run 指令直接运行一个 Alpine 容器&#xff0c;并指定运行的 Linux 指令&#xff0c;例如&#xff1a; PS C:\Users\yhu> docker run alpine echo 123 Unable to find image alpine:latest lo…

Commit failed (details follow):is out of date

Commit failed (details follow):is out of date 关于SVN提交时报out-of-date错误的解决方法 提交项目文件时&#xff0c;报如下的信息&#xff1a; Item is out-of-date svn: Commit failed (details follow): svn: Item ‘/xxx/xxx/xxx/xxx/xxx/xxx’ is out of date 原因&…

手写Spring5【笔记】

Spring5【笔记】 前言前言推荐Spring5【笔记】1介绍2手写 最后 前言 这是陈旧已久的草稿2022-12-01 23:32:59 这个是刷B站的时候&#xff0c;看到一个手写Spring的课程。 最后我自己好像运行不了&#xff0c;就没写。 现在2024-5-12 22:22:46&#xff0c;发布到[笔记]专栏中…

队列(详解)

一.队列的概念 队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;它按照先进先出的原则管理数据。这意味着最先进入队列的元素将被最先移出队列&#xff0c;类似于现实生活中排队的场景。 在队列中&#xff0c;数据项被添加到队列的一端&#xff0c;称为队尾…

cmu15445 2023fall project3 详细过程(下)QUERY EXECUTION

QUERY EXECUTION task3/task4 Task #3 - HashJoin Executor and Optimization1、HashJoin1.1 思路1.2 代码 2 NestedLoopJoin优化为HashJoin2.1 思路2.2 代码 Task #4 Sort Limit Executors Top-N Optimization Window Functions1、Sort1.1 思路1.2 代码 2、Limit Executors2…

数据可视化第五天(读取文件获得男生女生身高信息,并且可视化在一个图像)

文件 需要学生文件的可以私信我 过程 利用numpy的loadtxt文件读取学号&#xff0c;性别&#xff0c;和身高。 import numpy as np import matplotlib.pyplot as pltfilename/Users/oommnn/Desktop/python学习/数据分析/网课资料/第04天/student-data.txtuser_infonp.dtype(…

文献阅读——LPPLS(2)

A study on the bursting point of Bitcoin based on the BSADF and LPPLS methods 文献来源[2] Yao, Can-Zhong, and Hong-Yu Li. “A study on the bursting point of Bitcoin based on the BSADF and LPPLS methods.” The North American Journal of Economics and Financ…

猫头虎分享已解决Bug || **Vue.js脚手架安装失败** Error: unable to fetch template`

猫头虎分享已解决Bug &#x1f42f; || Vue.js脚手架安装失败 &#x1f6ab;Error: unable to fetch template 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题…

CodeTop 高频笔试题总结(持续更新)

&#x1f3c6; 频率从高到低排序 &#x1f468;‍&#x1f3eb; 参考的频率数据&#xff1a;CodeTop &#x1f468;‍&#x1f3eb; 力扣hot100 无重复字符的最长子串 双指针 滑动窗口 哈希&#x1f468;‍&#x1f3eb; 力扣hot100 反转链表 指针 递归 一题多解&#x1f468;‍…

7. path路径绘制:使用path绘制曲线

曲线在SVG中通常是通过贝塞尔曲线命令来绘制的&#xff0c;包括二次贝塞尔曲线&#xff08;Q&#xff09;和三次贝塞尔曲线&#xff08;C&#xff09;。这些命令允许我们创建平滑的曲线路径。 贝塞尔曲线的原理 贝塞尔曲线的基本原理是通过控制点和锚点来定义一条曲线的形状。…

命名规范总结Java

小驼峰命名 主要用于变量和方法的命名&#xff0c;当标识符是一个单词时首字母小写&#xff0c;当标识符为多个单词时第一个单词首字母小写&#xff0c;其他单词首字母大写 大驼峰命名 主要用于类(Class)名等。标识符各个单词首字母大写。 全部大写命名 常量名 全部小写命…

持续总结中!2024年面试必问 100 道 Java基础面试题(四十一)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 100 道 Java基础面试题&#xff08;四十&#xff09;-CSDN博客 八十一、Java内存模型是什么&#xff1f; Java内存模型&#xff08;Java Memory Model, JMM&#xff09;是Java虚拟机&#xff08;JVM&#xff09;…

海豚知道知识付费平台,大V都在用,新手也能做,网络营销是什么?如何向销售转化?

我国的市场营销已经全面步入互联网时代&#xff0c;教育行业也逐渐网络化&#xff0c;通过互联网发家壮大的机构比比皆是&#xff0c;然而仍旧有很多中小型教育培训机构&#xff0c;没有从事网络营销推广&#xff0c;或者从事了效果非常不理想。网络营销是什么&#xff0c;如何…