JWT令牌
1. JWT
概述
JWT
即JSON Web Token
,是一个开放标准,用于在各方之间安全地传输信息。并且JWT
经过数字签名,安全性高。通俗来说,也就是以JSON
形式作为Web
应用中的令牌,用于信息传输,在数据传输过程中可以完成数据加密、签名等相关处理。
JWT
由于其简洁、自包含和易于验证的特性,被广泛应用于各种场景,尤其是在分布式系统中:
- 身份验证
Authentication)
:这是JWT
最常见的用途。当用户成功登录后,服务器会返回一个JWT
给客户端。客户端将JWT
存储起来,并在后续的每个请求中携带JWT
。服务器通过验证JWT
,可以确认用户的身份,而无需依赖传统的Session
或Cookie
机制,这对于构建无状态的RESTful API
非常有用。 - 授权
Authorization
:一旦用户通过身份验证,JWT
还可以用于授权。Payload
中可以包含用户的角色、权限等信息。服务器在接收到客户端的请求后,可以通过解析JWT
中的这些信息,判断用户是否有权限访问特定的资源或执行特定的操作。 - 信息交换
Information Exchange
:JWT
可以在各方之间安全地传输信息。由于JWT
可以被签名并且加密,因此可以确保信息的完整性和机密性。例如,在微服务架构中,不同的服务之间可以使用JWT
来传递用户身份信息或其他安全相关的声明。 - 单点登录
Single Sign-On, SSO
:JWT
可以方便地实现SSO
。当用户在一个应用中登录后,认证服务器可以生成一个包含用户身份信息的JWT
,其他信任该认证服务器的应用可以通过验证这个JWT
,实现用户的免登录访问。 - 无状态的
API
:传统的Session
机制需要在服务器端存储用户的会话信息,这在用户量大或者需要水平扩展的场景下会带来挑战。JWT
是自包含的,所有的状态都存储在Token
本身,服务器不需要维护会话存储,从而更容易实现无状态的 API 和服务的扩展。 - 移动应用认证
Mobile App Authentication
:JWT
非常适合移动应用与后端服务器之间的身份验证。由于JWT
本身就是一个字符串,可以方便地通过HTTP Header
或其他方式传递,而不需要依赖浏览器特定的Cookie
机制。 - 安全地传递临时凭证
Securely Passing Temporary Credentials
:例如在用户找回密码的流程中,可以生成一个包含临时凭证和过期时间的JWT
,通过邮件发送给用户。用户点击链接后,服务器验证JWT
的有效性,并允许用户重置密码。
总而言之,JWT
是一种强大且灵活的安全令牌,广泛应用于现代Web
应用和分布式系统中,用于解决身份验证、授权和安全信息传输等问题。
2. Session
认证
Session
认证是一种基于服务端会话管理的身份验证机制,主要用于跟踪用户的登录状态。其核心流程如下:
- 会话初始化:用户首次登录时,服务端验证用户名和密码后,生成唯一
Session ID
,并将用户数据如用户ID
、权限存储在服务端内存或数据库中。 - 凭证传递:服务端通过
HTTP
响应头的Set-Cookie
字段将Session ID
发送至客户端,浏览器自动将其保存为Cookie
。 - 会话维持:客户端后续请求时,浏览器自动携带
Cookie
中的Session ID
。服务端通过该ID
查询会话存储,验证用户身份和权限。
该方式可以很好的解决身份验证的问题,但是同时也暴露了以下问题:
- 每个用户经过应用验证之后,都需要在服务器做保存会话记录,通常来说
session
都是保存在内存中的,随着认证用户越多,服务端的开销也会越来越大。 - 在分布式环境下需要同步存储【
session
共享】,限制了负载均衡器的能力,也限制了应用的扩展能力。 - 基于
Cookie
来进行用户识别,cookie
如果被截获,用户很容易遭受跨站请求伪造的攻击。xss
攻击:跨站脚本攻击,通过向网页注入恶意脚本,利用浏览器信任机制在用户端执行攻击代码的安全漏洞。攻击者可通过注入的脚本窃取用户敏感信息如Cookie
、会话令牌或劫持用户操作。xsrf
攻击:利用用户已登录的身份,诱导其点击恶意链接或访问含恶意请求的页面,以用户名义执行非授权操作,如转账、修改密码。
- 在前后端分离项目中,部署困难。
为了解决以上问题,可以使用Token
认证,如JWT
认证。
3. JWT
认证
3.1 JWT
原理
一个JWT
是一个由三部分组成的字符串,这三部分之间用点 .
分隔。如下:
-
Header
头部:通常包含以下两部分:Header
会经过Base64Url
编码形成JWT
的第一部分。这方便之后的解码。typ
:token
的类型,对于JWT
来说,就是JWT
。alg
:签名算法,如HS256
、RSA
。
-
Payload
载荷:Payload
也会经过Base64Url
编码形成JWT
的第二部分。Payload是未加密的,不要在其中放入敏感信息。- 包含
claims
声明,是关于实体和其它数据的声明。 Payload
中可以包含三种类型的claims
:Registered claims
注册声明:这是一组预定义的声明,不是强制性的,但推荐使用,例如:iss
:JWT
的签发者。sub
:JWT
的主题。aud
:JWT
的接收方。exp
:JWT
的过期时间。nbf
:在此时间之前,JWT
不可用。iat
:JWT
的签发时间。jti
:JWT
的唯一标识符。
Public claims
公共声明:可以由JWT
的使用者自定义,但为了避免冲突,应该在IANA JSON Web Token Registry
中注册。Private claims
私有声明:由生成和使用JWT
的双方自定义的声明,用于传递自定义信息。
- 包含
-
Signature
签名:用于验证JWT
的完整性和真实性,签名是基于Header
和Payload
,使用Header
中指定的签名算法以及一个secret 密钥生成的。HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
总的来说,JWT
的生成和验证流程如下:
-
生成
JWT
:-
服务器接收到用户的登录请求并验证凭据。如果验证成功,服务器会创建一个包含用户身份信息和其他必要信息的
Payload
。 -
服务器选择一个签名算法,并使用该算法、
Payload
和一个只有服务器知道的Secret Key
对Header
和Payload
进行签名。 -
Header
、Payload
和Signature
经过Base64Url
编码后用.
连接起来,形成最终的JWT
。 -
服务器将
JWT
返回给客户端。
-
-
使用
JWT
进行身份验证:-
客户端在后续的
HTTP
请求中,通常通过Authorization
请求头携带JWT
。 -
服务器接收到请求后,会提取
JWT
。 -
服务器对
JWT
的Header
和Payload
进行Base64Url
解码。 -
服务器使用相同的签名算法和
Secret Key
,对解码后的Header
和Payload
重新计算签名。服务器将重新计算的签名与JWT
中包含的Signature
进行比较。如果签名一致,则说明JWT
没有被篡改,并且是由服务器颁发的。 -
服务器还会验证
Payload
中的声明,例如exp
,以确保JWT
仍然有效。 -
如果验证通过,服务器就认为客户端是经过身份验证的,并根据
JWT
中包含的信息授予相应的访问权限。
-
相较于传统的Session
相比,JWT
有以下优势:
- 无状态:
Session
机制需要在服务端存储用户的会话信息,但是JWT
是自包含的,用户的状态信息都存储在Token
本身【payload
中】,且该Token
存储在客户端。这样就降低了服务器的压力,提高性能。 - 可扩展性:不同的服务之间可以共享相同的密钥来验证
JWT
,而无需共享Session
存储或进行跨服务的Session
查询,很适合分布式应用。这降低了服务之间的耦合性,提高系统的可扩展性。 - 跨域/跨平台:传统的
Session
跨域请求时可能会受到限制,如何浏览器的同源策略。JWT
作为一个独立的Token
字符串,可以方便的通过请求头Authorization
或请求体在不同的域或平台传递,具有更好的跨域和跨平台兼容性。 - 更适合移动应用:移动应用通常不依赖浏览器的
Cookie
机制来管理Session
。JWT
可以很方便的存储在移动应用的本地存储中,并通过自定义请求头发送给服务器,与后端api
进行身份验证。
4. 代码实现
import time# Create your tests here.
import jwt
import datetimedef create_token(secret_key, user_id, username, exp=10):"""生成JWT令牌"""# 定义payloadpayload = {'user_id': user_id,'username': username,# 设置过期时间'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=exp),# jwt的签发时间'iat': datetime.datetime.utcnow()}token = jwt.encode(payload, secret_key, algorithm='HS256')return tokendef verify_token(token, secret_key):"""验证JWT令牌"""try:payload = jwt.decode(token, secret_key, algorithms=['HS256'])print("JWT OK")except jwt.ExpiredSignatureError:print("JWT has expired")return Noneexcept jwt.InvalidSignatureError:print("Invalid JWT signature")return Noneexcept jwt.DecodeError:print("Invalid JWT format")return Noneif __name__ == '__main__':# 安全密钥SECRET_KEY = 'ashkjfhaafjh+@@safdnsjkf'user = {'id': 1,'username': 'admin'}# 生成JWT令牌token = create_token(SECRET_KEY, user['id'], user['username'])# 验证JWT令牌payload1 = verify_token(token, SECRET_KEY) # JWT OKtime.sleep(12)payload2 = verify_token(token, SECRET_KEY) # JWT has expired
相关文章:
JWT令牌
1. JWT概述 JWT即JSON Web Token,是一个开放标准,用于在各方之间安全地传输信息。并且JWT经过数字签名,安全性高。通俗来说,也就是以JSON形式作为Web应用中的令牌,用于信息传输,在数据传输过程中可以完成数…...
Qwen3技术报告解读
https://github.com/QwenLM/Qwen3/blob/main/Qwen3_Technical_Report.pdf 节前放模型,大晚上的发技术报告。通义,真有你的~ 文章目录 预训练后训练Long-CoT Cold StartReasoning RLThinking Mode FusionGeneral RLStrong-to-Weak Distillation 模型结构…...
RAG-MCP:突破大模型工具调用瓶颈,告别Prompt膨胀
大语言模型(LLM)的浪潮正席卷全球,其强大的自然语言理解、生成和推理能力,为各行各业带来了前所未有的机遇。然而,正如我们在之前的探讨中多次提及,LLM并非万能。它们受限于训练数据的时效性和范围…...
Flask框架入门与实践
Flask框架入门与实践 Flask是一个轻量级的Python Web框架,以其简洁、灵活和易于上手的特点深受开发者喜爱。本文将带您深入了解Flask的核心概念、基本用法以及实际应用。 什么是Flask? Flask是由Armin Ronacher于2010年开发的微型Web框架。与Django等…...
PD 分离推理的加速大招,百度智能云网络基础设施和通信组件的优化实践
为了适应 PD 分离式推理部署架构,百度智能云从物理网络层面的「4us 端到端低时延」HPN 集群建设,到网络流量层面的设备配置和管理,再到通信组件和算子层面的优化,显著提升了上层推理服务的整体性能。 百度智能云在大规模 PD 分离…...
罗杰斯高频板技术解析:低损耗基材如何定义 5G 通信未来
在 5G 通信与尖端电子技术加速融合的时代,高频 PCB 作为信号传输的核心载体,对材料性能与工艺精度提出了极致要求。猎板 PCB 深耕行业多年,始终以罗杰斯(Rogers)板材为核心介质,构建起从材料适配到精密制造…...
QML 动画控制、顺序动画与并行动画
目录 引言相关阅读基础属性说明工程结构示例代码解析示例1:手动控制动画(ControlledAnimation.qml)示例2:顺序动画(SequentialAnimationDemo.qml)示例3:并行动画(ParallelAnimationD…...
【动态导通电阻】GaN HEMT动态导通电阻的精确测量
2023 年 7 月,瑞士洛桑联邦理工学院的 Hongkeng Zhu 和 Elison Matioli 在《IEEE Transactions on Power Electronics》期刊发表了题为《Accurate Measurement of Dynamic ON-Resistance in GaN Transistors at Steady-State》的文章,基于提出的稳态测量方法,研究了氮化镓(…...
2:OpenCV—加载显示图像
加载和显示图像 从文件和显示加载图像 在本节中,我将向您展示如何使用 OpenCV 库函数从文件加载图像并在窗口中显示图像。 首先,打开C IDE并创建一个新项目。然后,必须为 OpenCV 配置新项目。 #include <iostream> #include <ope…...
Qt控件:交互控件
交互控件 1. QAction核心功能API 1.2 实例应用情况应用场景 1. QAction ##1. 1简介与API QAction 是一个核心类,用于表示应用程序中的一个操作(如菜单项、工具栏按钮或快捷键触发的功能)。它将操作的逻辑与 UI 表现分离,使代码更…...
在vue3中使用Cesium的保姆教程
1. 软件下载与安装 1. node安装 Vue.js 的开发依赖于 Node.js 环境,因此我们首先需要安装 Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许你在服务器端运行 JavaScript 代码,同时也为前端开发提供了强大的工具支…...
zst-2001 下午题-历年真题 试题一到三
试题一 问题一 1 问题一 2 注意每句话中的“给”… 问题一 3 问题二 1 问题二 2 问题二 3 问题三 1 步骤一.看父图的数据流在子图有没有缺失 步骤二.看加工有没有输入输出 步骤三.阅读理解 问题三 2 实体和存储不能划线 问题三 3 试题二 问题一 1 问题一 2 问题一 3 问题二…...
STM32的ADC模块中,**采样时机(Sampling Time)**和**转换时机(Conversion Time),获取数据的时机详解
在STM32的ADC模块中,**采样时机(Sampling Time)和转换时机(Conversion Time)**是ADC工作流程中的两个关键阶段,直接影响采样精度和系统实时性。以下是详细解析: 1. 采样时机(Samplin…...
iOS音视频解封装分析
首先是进行解封装的简单的配置 /// 解封装配置 class KFDemuxerConfig {// 媒体资源var asset: AVAsset?// 解封装类型,指定是音频、视频或两者都需要var demuxerType: KFMediaType .avinit() {} }然后是实现解封装控制器 import Foundation import CoreMedia i…...
探究电阻分压的带负载能力
我们经常使用两个电阻去分压来获得特定的电压,那么我是两个大阻值电阻分压获得的电压驱动能力强,还是小阻值电阻分压得到的电压驱动能力强呢? 一、电压相同时,电流的大小 下面是两个阻值分压得到的仿真图 电路分析: VCC都是5V,探针1和探针2测到的电压都是1.67V; 根据…...
14、Python时间表示:Unix时间戳、毫秒微秒精度与time模块实战
适合人群:零基础自学者 | 编程小白快速入门 阅读时长:约5分钟 文章目录 一、问题:计算机中的时间的表示、Unix时间点?1、例子1:计算机的“生日”:Unix时间点2、答案:(1)U…...
PCL 绘制二次曲面
文章目录 一、简介二、实现代码三、实现效果一、简介 这里基于二次曲面的公式: z = a 0 + a 1 x + a 2 y + a...
消息队列与Kafka基础:从概念到集群部署
目录 一、消息队列 1.什么是消息队列 2.消息队列的特征 3.为什么需要消息队列 二、Kafka基础与入门 1.Kafka基本概念 2.Kafka相关术语 3.Kafka拓扑架构 4.Topic与partition 5.Producer生产机制 6.Consumer消费机制 三、Zookeeper概念介绍 1.zookeeper概述 2.zooke…...
计算机指令分类和具体的表示的方式
1.关于计算机的指令系统 下面的这个就是我们的一个简单的计算机里面涉及到的指令: m就是我们的存储器里面的地址,可以理解为memory这个意思,r可以理解为rom这样的单词的首字母,帮助我们去进行这个相关的指令的记忆,不…...
pcie phy-电气层-gen1/2(TX)
S IP物理层讲解 在synopsys IP中对于phy层的内容分离的比较多: cxpl中: u_cx_phy_logical:包含ts序列的解析(smlh); pipe层协议的转换(rmlh,xmlh);pipe转dllp包(rplh&…...
Baklib加速企业AI数据智理转型
Baklib智理AI数据资产 在AI技术深度渗透业务场景的背景下,Baklib通过构建企业级知识中台架构,重塑了数据资产的治理范式。该平台采用智能分类引擎与语义分析模型,将分散在邮件、文档、数据库中的非结构化数据转化为标准化的知识单元…...
深度学习驱动下的目标检测技术:原理、算法与应用创新
一、引言 1.1 研究背景与意义 目标检测作为计算机视觉领域的核心任务之一,旨在识别图像或视频中感兴趣目标的类别,并确定其在图像中的位置,通常以边界框(Bounding Box)的形式表示 。其在现实生活中有着极为广泛且…...
window 显示驱动开发-使用有保证的协定 DMA 缓冲区模型
Windows Vista 的显示驱动程序模型保证呈现设备的 DMA 缓冲区和修补程序位置列表的大小。 修补程序位置列表包含 DMA 缓冲区中命令引用的资源的物理内存地址。 在有保证的协定模式下,用户模式显示驱动程序知道 DMA 缓冲区和修补程序位置列表的确切大小,…...
《指针与整数相加减的深入解析》
🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言 🌍文章目入 一、指针与整数相加的原理二、指针与整数相减的原理三、使用场景(一)数组操作(二)内存遍历 四、注意事项&…...
C++_STL_map与set
1. 关联式容器 在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、 forward_list(C11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面 存储的是元素本身。那什么是…...
1949-2022年各省农作物播种面积数据(22个指标)
1949-2022年各省农作物播种面积数据(22个指标) 1、时间:1949-2022年 2、来源:各省年鉴、国家统计局、农业部、农业年鉴 3、范围:31省 4、指标:年度标识、省份编码、省份名称、农作物总播种面积、粮食作…...
汽车二自由度系统模型以及电动助力转向系统模型
汽车二自由度系统模型与电动助力转向系统(EPS)的详细建模方案,包含理论推导、MATLAB/Simulink实现代码及参数说明: 一、二自由度汽车模型 1. 模型描述 包含以下两个自由度: 横向运动(侧向加速度…...
【学习笔记】计算机操作系统(四)—— 存储器管理
第四章 存储器管理 文章目录 第四章 存储器管理4.1 存储器的层次结构4.1.1 多层结构的存储器系统4.1.2 主存储器与寄存器4.1.3 高速缓存和磁盘缓存 4.2 程序的装入和链接4.2.1 程序的装入4.2.2 程序的链接 4.3 连续分配存储管理方式4.3.1 单一连续分配4.3.2 固定分区分配4.3.3 …...
51单片机的lcd12864驱动程序
#include <reg51.h> #include <intrins.h>#define uchar...
(03)数字化转型之库存管理:从进库到出库的数字化运营
在当今竞争激烈的商业环境中,高效的库存管理已成为企业降低成本、提高运营效率的关键。本文将系统性地介绍库存管理的全流程,包括进库、出库、移库、盘点等核心环节,帮助企业构建科学合理的库存管理体系。 一、进库管理:从计划到执…...
windows编程中加载DLL的两种典型方式的比较
文章目录 DLL定义头文件定义CPP实现DLL的调用代码直接使用通过LoadLibrary调用导入表的依赖LoadLibrary使用DLL库中的类DLL中定义工厂函数调用时的代码补充:为什么LoadLibrary不能直接导出类在windows的编程中,使用DLL是一个非常常见的操作。一般来说,有两种集成DLL的方式:…...
存储器上如何存储1和0
在计算机存储器中,数据最终以**二进制形式(0和1)**存储,这是由硬件特性和电子电路的物理特性决定的。以下是具体存储方式的详细解析: 一、存储的物理基础:半导体电路与电平信号 计算机存储器(…...
【笔记】记一次PyCharm的问题反馈
#工作记录 最近更新至 PyCharm 社区版的最新版本后,我遇到了多个影响使用体验的问题。令人感到不便的是,一些在旧版本中非常便捷的功能,在新版本中却变得操作复杂、不够直观。过去,我一直通过 PyCharm 内置的故障报告与反馈机制反…...
logrotate按文件大小进行日志切割
✅ 编写logrotate文件,进行自定义切割方式 adminip-127-0-0-1:/data/test$ cat /etc/logrotate.d/test /data/test/test.log {size 1024M #文件达到1G就切割rotate 100 #保留100个文件compressdelaycompressmissingoknotifemptycopytruncate #这个情况服务不用…...
基于大模型的脑出血智能诊疗与康复技术方案
目录 一、术前阶段1.1 数据采集与预处理系统伪代码实现流程图1.2 特征提取与选择模块伪代码实现流程图1.3 大模型风险评估系统伪代码实现流程图二、术中阶段2.1 智能手术规划系统伪代码实现流程图2.2 麻醉智能监控系统伪代码实现流程图三、术后阶段3.1 并发症预测系统伪代码片段…...
P21-RNN-心脏病预测
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、RNN 循环神经网络(Recurrent Neural Network,简称 RNN)是一类以序列数据为输入,在序列的演进方向进行递归…...
懒汉式单例模式的线程安全实现
懒汉式单例模式的线程安全实现 懒汉式单例模式的核心特点是延迟实例化(在第一次使用时创建对象),但其基础实现存在线程安全问题。以下是不同线程安全实现方式的详细说明和对比: 1. 非线程安全的基础懒汉式 public class UnsafeLazySingleton {private static UnsafeLazyS…...
Java 常用的Arrays函数
文章目录 ArrayssorttoStringbinarySearchequalsfill 数组拷贝copyOfcopyOfRangearraycopy 二维数组定义遍历deepToString空指针异常 Arrays sort int[] array new int[]{1,20,3}; Arrays.sort(array);// 1 3 20toString 帮助数组转为字符串 int[] array new int[]{1,2,3…...
FEKO许可证与版本兼容性问题
随着电磁仿真技术的不断进步,FEKO软件不断更新迭代,为用户提供更强大的功能和更优秀的性能。然而,在升级过程中,FEKO许可证与版本兼容性问题往往成为用户关注的焦点。本文将为您详细解读FEKO许可证与版本兼容性问题,帮…...
HarmonyOs开发之——— ArkWeb 实战指南
HarmonyOs开发之——— ArkWeb 实战指南 谢谢关注!! 前言:上一篇文章主要介绍HarmonyOs开发之———合理使用动画与转场:CSDN 博客链接 一、ArkWeb 组件基础与生命周期管理 1.1 Web 组件核心能力概述 ArkWeb 的Web组件支持加载本地或在线网页,提供完整的生命周期回调体…...
冰箱磁力贴认证标准16CFR1262
在亚马逊平台,冰箱磁力贴这类可能被儿童接触到的产品,有着严格的规范哦。必须得遵守 16 CFR 1262 标准,还得有符合该标准的测试报告和 GCC 证书,不然产品就可能被禁止销售或者面临召回,那可就损失大啦! …...
Java中的锁机制全解析:从synchronized到分布式锁
在多线程编程中,锁是保证线程安全的核心工具。本文将详解Java中常见的锁机制及其实际应用场景,帮助开发者选择最合适的锁方案。 一、内置锁:synchronized 原理 通过JVM内置的监视器锁(Monitor)实现,可修…...
OptiStruct实例:3D实体转子分析
上一节介绍了1D转子的临界转速分析。在1D转子模型中,转子是以集中质量单元的形式建模的。此种建模方法不可避免地会带来一些简化和局部特征的缺失。接下来介绍OptiStruct3D实体转子的建模及临界转速分析实例。 3D实体转子建立详细的转子网格模型,然后将…...
简单记录坐标变换
以三维空间坐标系为例 rTt代表机械手末端相对robot root坐标系的变换关系 rTt dot p_in_tool 可以把tool坐标系下表示的某点转到root坐标系表示 其中rTt表示tool相对于root坐标系的平移和旋转 以二维图像坐标系为例说明 1坐标系定为图片坐标系左上角,横平竖直的…...
自定义快捷键软件:AutoHotkey 高效的快捷键执行脚本软件
AutoHotkey 是一种适用于 Windows 的免费开源脚本语言,它允许用户轻松创建从小型到复杂的脚本,用于各种任务,例如:表单填充、自动点击、宏等。 定义鼠标和键盘的热键,重新映射按键或按钮,并进行类似自动更…...
【Android构建系统】了解Soong构建系统
背景介绍 在Android7.0之前,Android使用GNU Make描述和执行build规则。Android7.0引入了Soong构建系统,弥补Make构建系统在Android层面变慢、容易出错、无法扩展且难以测试等缺点。 Soong利用Kati GNU Make克隆工具和Ninja构建系统组件来加速Android的…...
显性知识的主要特征
有4个主要特征: 客观存在性静态存在性可共享性认知元能性...
STM32F407VET6实战:CRC校验
CRC校验在数据传输快,且量大的时候使用。下面是STM32F407VET6HAL库使用CRC校验的思路。 步骤实现: CubeMX配置 c // 在CubeMX中启用CRC模块 // AHB总线时钟自动启用 HAL库代码 c // 初始化(main函数中) CRC_HandleTypeDef …...
LeetCode 746 使用最小花费爬楼梯
当然可以!LeetCode 746 是一道经典的动态规划入门题,我来用 C 为你详细解释。 题目描述 给定一个整数数组 cost,其中每个元素 cost[i] 表示从第 i 个台阶向上爬需要支付的费用。一旦支付费用,你可以选择向上爬 1 步 或 2 步。 你…...
隧道结构安全在线监测系统解决方案
一、方案背景 隧道是地下隐蔽工程,会受到潜在、无法预知的地质因素影响。随着我国公路交通建设的发展,隧道占新建公路里程的比例越来越大。隧道属于线状工程,有的规模较大,可长达几公里或数十公里,往往穿越许多不同环境…...