当前位置: 首页 > news >正文

MCU程序加密保护(二)ID 验证法 加密与解密

STM32 微控制器内部具有一个 96 位全球唯一的 CPU ID,不可更改。开发者可利用此 ID 实现芯片绑定和程序加密,增强软件安全性。
ID 验证法就是利用这个 UID,对每颗芯片的身份进行识别和绑定,从而防止程序被复制。

实现方式:

  1. 在程序首次运行或出厂时,读取 CPU ID,经过不可逆算法(如 CRC32、SHA256)处理后生成一个校验值;

  2. 将该校验值写入 Flash;

  3. 每次程序启动时重新计算当前芯片 ID 的校验值,并与 Flash 中存储的值进行比较;

  4. 如果匹配,程序正常运行;否则程序终止,防止非法拷贝。

三、这种方法的优点:

优点说明
✅ 绑定芯片唯一身份因为 UID 不可修改,确保每个程序绑定一颗芯片
✅ 防止直接拷贝同样的程序拷贝到另一颗芯片上,会因 UID 不同而校验失败
✅ 可配合写保护存放校验值的 Flash 区域可以配合 WRP 写保护
✅ 可量产可以用上位机脚本自动读取 UID,计算校验值并写入 Flash

 下面只讲一种方法,方法肯定是不唯一的!

#define UID_BASE_ADDR       0x1FFFF7E8U
#define FLASH_CRC_ADDRESS   0x0800FC00U  // 最后一页(64KB Flash)起始地址
#define UID_WORD_COUNT      3
#define FLASH_PAGE_SIZE     1024U
#define CRC32_POLYNOMIAL    0xEDB88320Uint fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);return ch;
}void send_string(const char* str)
{HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), HAL_MAX_DELAY);
}void Print_UID(void)
{const uint32_t* uid = (const uint32_t*)UID_BASE_ADDR;char buf[64];snprintf(buf, sizeof(buf), "[STM32 UID] %08lX-%08lX-%08lX\r\n", uid[2], uid[1], uid[0]);send_string(buf);
}uint32_t Calculate_UID_CRC32(void)
{const uint32_t *uid = (const uint32_t *)UID_BASE_ADDR;uint32_t crc = 0xFFFFFFFF;for (int i = 0; i < UID_WORD_COUNT; i++) {crc ^= uid[i];for (int j = 0; j < 32; j++) {if (crc & 1)crc = (crc >> 1) ^ CRC32_POLYNOMIAL;elsecrc >>= 1;}}return crc ^ 0xFFFFFFFF;
}uint32_t Read_Stored_CRC(void)
{return *(const uint32_t *)FLASH_CRC_ADDRESS;
}void Verify_UID(void)
{uint32_t calc_crc = Calculate_UID_CRC32();uint32_t stored_crc = Read_Stored_CRC();if (calc_crc != stored_crc) {char buf[128];snprintf(buf, sizeof(buf), "[ERROR] UID CRC Mismatch! Calc: 0x%08lX, Stored: 0x%08lX\r\n", calc_crc, stored_crc);send_string(buf);Error_Handler();} else {send_string("[INFO] UID CRC Verified OK\r\n");}
}void Store_UID_CRC_To_Flash(void)
{uint32_t crc = Calculate_UID_CRC32();HAL_FLASH_Unlock();FLASH_EraseInitTypeDef EraseInitStruct = {.TypeErase   = FLASH_TYPEERASE_PAGES,.PageAddress = FLASH_CRC_ADDRESS,.NbPages     = 1};uint32_t PageError = 0;if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {send_string("[ERROR] Flash Erase Failed\r\n");HAL_FLASH_Lock();return;}if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_CRC_ADDRESS, crc) != HAL_OK) {send_string("[ERROR] Flash Program Failed\r\n");HAL_FLASH_Lock();return;}HAL_FLASH_Lock();send_string("[INFO] UID CRC Stored to Flash\r\n");
}void Auto_Bind_UID_CRC_If_Needed(void)
{uint32_t stored_crc = Read_Stored_CRC();if (stored_crc == 0xFFFFFFFF)  // 判断是否首次上电{send_string("[INFO] No UID CRC Stored. Binding current chip...\r\n");Store_UID_CRC_To_Flash();  // 写入当前芯片 UID 的 CRC}
}void SystemClock_Config(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();Auto_Bind_UID_CRC_If_Needed();Print_UID();Verify_UID();while (1) {。。。。。。}
}

防止程序在“非原芯片”上运行

uint32_t calc_crc = Calculate_UID_CRC32();
uint32_t stored_crc = Read_Stored_CRC();

对 MCU 内置唯一的 UID 地址 0x1FFFF7E8 做了 CRC 校验,并将第一次计算的结果写入 Flash:

Store_UID_CRC_To_Flash(); // 用于首次存储 CRC
校验通过才能继续运行,否则 Error_Handler() 阻止执行。
这个机制可有效阻止程序被别人拷贝到其他 STM32 芯片后运行。

其次0xEDB88320U这个是干嘛的?

0xEDB88320UCRC32 多项式的反转形式(Reflected Polynomial),它是你代码中用于计算 CRC32 校验值的核心常数

什么是 CRC?

CRC(循环冗余校验)是一种常用于数据完整性校验的哈希算法,在嵌入式系统、通信、存储等领域被广泛使用。
它通过一个多项式除法运算对数据生成一个固定长度的校验值,用于检测数据在传输或存储中是否被篡改或损坏。

你用到的 0xEDB88320U 是什么?

这是标准 CRC32 算法中使用的 反射形式多项式

标准 CRC32 多项式(正向)

x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1

对应的二进制多项式值是:0x04C11DB7

反转版本(Reflected CRC):就是你代码中使用的

0xEDB88320\text{0xEDB88320}0xEDB88320

它等价于对 0x04C11DB7 的位反转处理。

STM32 的 HAL_CRC 或很多嵌入式代码实现中,都是按位反转(LSB first)方式计算 CRC,因此使用 0xEDB88320 是标准做法。

这种反转方式效率高,和实际硬件或工业协议(比如 Ethernet、ZIP 文件、PNG 图片、STM32 Bootloader 校验)保持一致。

此外上述代码已经验证,拷贝后在别的扳机程序无法运行!达到效果!

但是!加密完总得自己解密哈哈,相比于闪存加密的方法,这个方法还有很多漏洞的,毕竟是软件加密,如下为漏洞分析!

安全目标是否达成原因
防止程序拷贝到其他芯片运行✅ ✅ ✅UID 校验 OK
防止程序被他人反编译修改绕过校验没有开启 RDP,程序可读出
防止校验值被改写绕过校验没有开启写保护(WRP)
防止程序被整个二进制拷贝RDP 未开启

此为量产方式

方案需要写入 UID CRC是否支持量产烧录器是否支持自动化推荐场景
A(运行时绑定)不用提前写入,程序首次运行自动绑定✅ 支持全自动烧录最推荐,适合量产
B(编译时绑定)烧录前需写入 CRC❌ 烧录前需人工或脚本操作✅ 有产测平台时适用小批量

当然漏洞是有的,但是我们将闪存保护法跟id验证法放在一起,并且将下述方法加在一起,更多方法进行融合,达到真正的加密效果!

目前只是对 UID 本身做 CRC32,攻击者拿到程序和 CRC 算法很容易在自己芯片上重算并替换。
改进: 在计算 CRC 前,把 UID 跟一个“固化私钥”一起混合,再做 CRC。

#define SECRET_KEY_WORD   0xA5A5BEEFULuint32_t Calculate_Mixed_CRC32(void)
{const uint32_t *uid = (const uint32_t*)UID_BASE_ADDR;uint32_t buffer[UID_WORD_COUNT + 1] = {uid[0], uid[1], uid[2], SECRET_KEY_WORD};uint32_t crc = 0xFFFFFFFF;for (int i = 0; i < UID_WORD_COUNT + 1; i++) {crc ^= buffer[i];for (int j = 0; j < 32; j++) {if (crc & 1)crc = (crc >> 1) ^ CRC32_POLYNOMIAL;elsecrc >>= 1;}}return crc ^ 0xFFFFFFFF;
}

结合 Option Bytes 自动锁定

Auto_Bind_UID_CRC_If_Needed() 中一旦绑定完成,即可顺带触发 RDP Level1 和写保护:

void Secure_Lock_Device(void)
{FLASH_OBProgramInitTypeDef ob = {0};HAL_FLASH_Unlock();HAL_FLASH_OB_Unlock();HAL_FLASHEx_OBGetConfig(&ob);// 只在 Level0 时生效,避免重复擦除if (ob.RDPLevel == OB_RDP_LEVEL_0) {ob.OptionType = OPTIONBYTE_RDP | OPTIONBYTE_WRP;ob.RDPLevel   = OB_RDP_LEVEL_1;ob.WRPState   = OB_WRPSTATE_ENABLE;ob.WRPPage    = OB_WRP_PAGES60TO63;  // 保护 CRC 存储页HAL_FLASHEx_OBProgram(&ob);}HAL_FLASH_OB_Lock();HAL_FLASH_Lock();
}

使用硬件 CRC 外设或查表加速

软件 bitwise CRC32 性能偏低,可考虑:

STM32F1 的 CRC 外设(部分型号支持)

或者用 256 项的查表法,把 0xEDB88320 的查表数组预先生成,运算速度提升 5~10 倍。

static const uint32_t crc32_table[256] = { /* 预生成的 256 项 */ };uint32_t CRC32_Table(const uint8_t *data, uint32_t len) {uint32_t crc = 0xFFFFFFFF;while (len--) {crc = (crc >> 8) ^ crc32_table[(crc ^ *data++) & 0xFF];}return crc ^ 0xFFFFFFFF;
}

 

相关文章:

MCU程序加密保护(二)ID 验证法 加密与解密

STM32 微控制器内部具有一个 96 位全球唯一的 CPU ID&#xff0c;不可更改。开发者可利用此 ID 实现芯片绑定和程序加密&#xff0c;增强软件安全性。 ID 验证法就是利用这个 UID&#xff0c;对每颗芯片的身份进行识别和绑定&#xff0c;从而防止程序被复制。 实现方式&#xf…...

SparkSQL的基本使用

SparkSQL 是 Apache Spark 的一个模块&#xff0c;用于处理结构化数据。它提供了一个高性能、分布式的 SQL 查询引擎&#xff0c;可以轻松处理各种数据源&#xff0c;包括结构化数据、半结构化数据和非结构化数据12。 SparkSQL 的特点 易整合&#xff1a;SparkSQL 无缝整合了…...

QListWedget控件使用指南

QListWedget公共函数 函数签名功能描述QListWidget(QWidget *parent nullptr)构造函数&#xff0c;创建一个QListWidget对象&#xff0c;可指定父部件&#xff08;默认为nullptr&#xff09;。virtual ~QListWidget()虚析构函数&#xff0c;释放QListWidget对象及其资源。voi…...

primitive创建图像物体

本节我们学习使用entity来创建物体 我们以矩形为例,在输入矩形的四个点后运行程序 //使用entity创建矩形var rectangle viewer.entities.add({rectangle: {coordinates:Cesium.Rectangle.fromDegrees(//西边的经度90,//南边维度20,//东边经度110,//北边维度30 ),material:Ces…...

MySQL 服务器配置和管理(上)

MySQL 服务器简介 通常所说的 MySQL 服务器指的是mysqld(daemon 守护进程)程序&#xff0c;当运⾏mysqld后对外提供MySQL 服务&#xff0c;这个专题的内容涵盖了以下关于MySQL 服务器以及相关配置的内容&#xff0c;包括&#xff1a; • 服务器⽀持的启动选项。可以在命令⾏和…...

跨区域智能电网负荷预测:基于 PaddleFL 的创新探索

跨区域智能电网负荷预测:基于 PaddleFL 的创新探索 摘要: 本文聚焦跨区域智能电网负荷预测,提出基于 PaddleFL 框架的联邦学习方法,整合多地区智能电网数据,实现数据隐私保护下的高精度预测,为电网调度优化提供依据,推动智能电网发展。 一、引言 在当今社会,电力作为经…...

Java 重试机制详解

文章目录 1. 重试机制基础1.1 什么是重试机制1.2 重试机制的关键要素1.3 适合重试的场景2. 基础重试实现2.1 简单循环重试2.2 带延迟的重试2.3 指数退避策略2.4 添加随机抖动2.5 使用递归实现重试2.6 可重试异常过滤3. 常用重试库介绍3.1 Spring Retry3.1.1 依赖配置3.1.2 编程…...

Spark缓存---cache方法

在Spark 中&#xff0c;cache() 是用于优化计算性能的核心方法之一&#xff0c;但它有许多细节需要深入理解。以下是关于 cache() 的详细技术解析&#xff1a; 1. cache() 的本质 简化的 persist()&#xff1a;cache() 是 persist(StorageLevel.MEMORY_ONLY) 的快捷方式&#…...

一分钟了解大语言模型(LLMs)

一分钟了解大语言模型&#xff08;LLMs&#xff09; A Minute to Know about Large Language Models (LLMs) By JacksonML 自从ChatGPT上线发布以来&#xff0c;在短短的两年多时间里&#xff0c;全球ChatBot&#xff08;聊天机器人&#xff09;发展异常迅猛&#xff0c;更为…...

当数控编程“联姻”AI:制造工厂的“智能大脑”如何炼成?

随着DeepSeek乃至AI人工智能技术在企业中得到了广泛的关注和使用&#xff0c;多数企业开始了AI探索之旅&#xff0c;迅易科技也不例外&#xff0c;且在不断地实践中强化了AI智能应用创新的强大能力。许多制造企业面临着工艺知识传承困难、编程效率低下等诸多挑战&#xff0c; 今…...

鸿蒙OSUniApp 实现的二维码扫描与生成组件#三方框架 #Uniapp

UniApp 实现的二维码扫描与生成组件 前言 最近在做一个电商小程序时&#xff0c;遇到了需要扫描和生成二维码的需求。在移动应用开发中&#xff0c;二维码功能已经成为标配&#xff0c;特别是在电商、社交和支付等场景下。UniApp作为一个跨平台开发框架&#xff0c;为我们提供…...

【Python 内置函数】

Python 内置函数是语言核心功能的直接体现&#xff0c;无需导入即可使用。以下是精选的 10 大类、50 核心内置函数详解&#xff0c;涵盖日常开发高频场景&#xff1a; 一、数据类型转换 函数示例说明int()int("123") → 123字符串/浮点数转整数float()float("3…...

鸿蒙OSUniApp开发支持多语言的国际化组件#三方框架 #Uniapp

使用UniApp开发支持多语言的国际化组件 在全球化的今天&#xff0c;一个优秀的应用往往需要支持多种语言以满足不同地区用户的需求。本文将详细讲解如何在UniApp框架中实现一套完整的国际化解决方案&#xff0c;从而轻松实现多语言切换功能。 前言 去年接手了一个面向国际市场…...

MySQL之基础事务

目录 引言&#xff1a; 什么是事务&#xff1f; 事务和锁 mysql数据库控制台事务的几个重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意图&#xff1a; 2.事务的隔离级别 四种隔离级别&#xff1a; 总结一下隔离指令 1. 查看当前隔离级别​​ …...

OpenHarmony系统HDF驱动开发介绍(补充)

一、HDF驱动简介 HDF&#xff08;Hardware Driver Foundation&#xff09;驱动框架&#xff0c;为驱动开发者提供驱动框架能力&#xff0c;包括驱动加载、驱动服务管理、驱动消息机制和配置管理。 简单来说&#xff1a;HDF框架的驱动和Linux的驱动比较相似都是由配置文件和驱动…...

深度学习中的查全率与查准率:如何实现有效权衡

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型辅助生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认…...

文件名是 ‪E:\20250512_191204.mp4, EV软件录屏,未保存直接关机损坏, 如何修复?

去github上下载untrunc 工具就能修复 https://github.com/anthwlock/untrunc/releases 如果访问不了 本机的 hosts文件设置 140.82.112.3 github.com 199.232.69.194 github.global.ssl.fastly.net 就能访问了 实在不行&#xff0c;从这里下载&#xff0c;传上去了 https://do…...

界面控件DevExpress WinForms v24.2 - 数据处理功能增强

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…...

Web UI测试效率低?来试Parasoft Selenic的智能修复与分析!

如果你正在使用Selenium进行Web UI测试&#xff0c;但被测试维护的繁琐、测试不稳定以及测试执行缓慢等问题困扰&#xff0c;不妨试试Parasoft Selenic&#xff01; Parasoft Selenic能够通过智能修复与分析功能&#xff0c;帮你自动检测并修复测试中的不稳定因素&#xff0c;…...

计算机视觉最不卷的方向:三维重建学习路线梳理

提到计算机视觉&#xff08;CV&#xff09;&#xff0c;大多数人脑海中会立马浮现出一个字&#xff1a;“卷”。卷到什么程度呢&#xff1f;2022年秋招CV工程师岗位数下降了16%&#xff0c;但求职人数增加了23%&#xff0c;求职人数与招聘岗位的比例达到了恐怖的15:1&#xff0…...

国产 ETL 数据集成厂商推荐—谷云科技 RestCloud

数字化转型加速推进的商业环境中&#xff0c;数据已成为企业最为关键的资产之一。然而&#xff0c;随着企业信息化的建设不断深入&#xff0c;各个业务系统之间数据分散、格式不一、难以互通等问题日益凸显&#xff0c;严重制约了企业对数据价值的深度挖掘与高效利用。在此背景…...

vscode extention踩坑记

# npx vsce package --allow-missing-repository --no-dependencies #耗时且不稳定 npx vsce package --allow-missing-repository #用这行 code --install-extension $vsixFileName --force我问ai&#xff1a;为什么我的.vsix文件大了那么多 ai答&#xff1a;因为你没有用 --n…...

AI时代的弯道超车之第十二章:英语和编程重要性?

在这个AI重塑世界的时代,你还在原地观望吗?是时候弯道超车,抢占先机了! 李尚龙倾力打造——《AI时代的弯道超车:用人工智能逆袭人生》专栏,带你系统掌握AI知识,从入门到实战,全方位提升认知与竞争力! 内容亮点: AI基础 + 核心技术讲解 职场赋能 + 创业路径揭秘 打破…...

关于数据湖和数据仓的一些概念

一、前言 随着各行业数字化发展的深化,数据资产和数据价值已越来越被深入企业重要发展的战略重心,海量数据已成为多数企业生产实际面临的重要问题,无论存储容量还是成本,可靠性都成为考验企业数据治理的考验。本文来看下海量数据存储的数据湖和数据仓,数据仓库和数据湖,…...

hbase shell的常用命令

一、hbase shell的基础命令 # 客户端登录 [rootCloud-Hadoop-NN-02 hbase]$ ./bin/hbase shell# 查看所有表 hbase> list### 创建数据表student&#xff0c;包含Sname、Ssex、Sage、Sdept、course列族/列 ### 说明&#xff1a;列族不指定列名时&#xff0c;列族可以直接成为…...

高并发内存池(四):Page Cache结构设计

目录 一&#xff0c;项目整体框架回顾 Thread Cache结构 Central Cache结构 二&#xff0c;Page Cache大致框架 三&#xff0c;Page Cache申请内存实现 Central Cache向Page Cache申请内存接口 从Page Cache中获取span接口 Page Cache加锁问题 申请内存完整过程 源码&a…...

易学探索助手-项目记录(九)

本文介绍本地大模型推理数据集构成 &#xff08;一&#xff09;古籍数据获取 以44种竖向从右至左排列的繁体古文为研究对象&#xff0c;通过OCR识别、XML结构化处理&#xff0c;最终生成符合大模型训练要求的数据集。 1.技术路线设计 图像处理层&#xff1a;PaddleOCR识别竖…...

Idea 设置编码UTF-8 Idea中 .properties 配置文件中文乱码

Idea 设置编码UTF-8 Idea中 .properties 配置文件中文乱码 一、设置编码 1、步骤&#xff1a; File -> Setting -> Editor -> File encodings --> 设置编码二、配置文件中文乱码 1、步骤&#xff1a; File -> Setting -> Editor -> File encodings ->…...

Redis缓存穿透、雪崩、击穿的解决方案?

Redis 缓存问题解决方案及Java实现 一、缓存穿透解决方案 &#xff08;缓存穿透指查询不存在数据&#xff0c;绕过缓存直接访问数据库&#xff09; 1. 布隆过滤器 空值缓存 注意点&#xff1a; 1.布隆过滤器是需要预热数据的&#xff0c;就是需要输入当前数据库已经存在的…...

第29节:现代CNN架构-Inception系列模型

引言 Inception系列模型是卷积神经网络(CNN)发展历程中的重要里程碑,由Google研究人员提出并不断演进。这一系列模型通过创新的架构设计,在保持计算效率的同时显著提升了图像识别任务的性能。从最初的Inception v1到最新的Inception-ResNet,每一代Inception模型都引入了突破…...

初识C++:类和对象(上)

概述&#xff1a;本篇博客主要讲解类和对象的学习。 目录 1. 类的定义 1.1 类定义格式 1.2 访问限定符 1.3 类域 2.实例化 2.1 实例化概念 2.2 this指针 3. 小结 1. 类的定义 1.1 类定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{} 中为类的…...

腾讯 IMA 工作台升级:新增知识库广场与 @提问功能

目录 一、引言 二、知识库广场功能 2.1 功能架构解析 2.2 技术实现突破 三、知识库提问功能 3.1 交互模式革新 3.2 技术底层逻辑 四、实战价值 4.1 知识管理方面 4.2 工作效率提升方面 4.3 团队协作方面 4.4 知识变现方面 五、未来展望 5.1 技术演进方向 5.2 商业…...

[目标检测] YOLO系列算法讲解

前言 目标检测就是做到给模型输入一张图片或者视频&#xff0c;模型可以迅速判断出视频和图片里面感兴趣的目标所有的位置和它 的类别&#xff0c;而当前最热门的目标检测的模型也就是YOLO系列了。 YOLO系列的模型的提出&#xff0c;是为了解决当时目标检测的模型帧率太低而提…...

Python 之 selenium 打开浏览器指定端口进行接续操作

一般使用 selenium 进行数据爬取时&#xff0c;常用处理流程是让 selenium 从打开浏览器开始&#xff0c;完成全流程的所有操作。但是有时候&#xff0c;我们希望用户先自己打开浏览器进入指定网页&#xff0c;完成登录认证等一系列操作之后&#xff08;比如用户、密码、短信验…...

GPUGeek携手ComfyUI :低成本文生图的高效解决方案

一、文生图领域的困境与ComfyUI的优势 在当今数字化创意表达的时代&#xff0c;文生图技术日益受到关注。像豆包这类以语言交互为主的大模型&#xff0c;虽然在文本处理上表现出色&#xff0c;但在文生图方面&#xff0c;其生成效果难以达到专业图像创作的要求。而Midjourney&…...

OpenCV CUDA 模块中用于在 GPU 上计算两个数组对应元素差值的绝对值函数absdiff(

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 void cv::cuda::absdiff 是 OpenCV CUDA 模块中的一个函数&#xff0c;用于在 GPU 上计算两个数组对应元素差值的绝对值。 该函数会逐元素计算两…...

互联网大厂Java面试题:深入解析SpringCloud微服务架构中的服务注册与发现机制

互联网大厂Java面试题&#xff1a;深入解析SpringCloud微服务架构中的服务注册与发现机制 面试题 问题&#xff1a; 在SpringCloud微服务架构中&#xff0c;服务注册与发现是核心功能之一。请详细说明Nacos作为服务注册中心的实现原理&#xff0c;并对比其与Eureka的异同点。…...

东芝新四款产品“TB67Z830SFTG、TB67Z830HFTG、TB67Z850SFTG、TB67Z850HFTG系列三相栅极驱动器ic三相栅极驱动器IC

支持用于电动工具、吸尘器、工业机器人等的三相无刷DC电机 东芝电子设备与存储公司(简称“东芝”)推出了TB67Z83xxFTG系列三相栅极驱动器ic的四个产品和TB67Z85xxFTG系列三相栅极驱动器IC的四个产品&#xff0c;用于消费和工业设备的三相无刷DC电机。通过将新产品与作为电机控制…...

react+html-docx-js将页面导出为docx

1.主要使用&#xff1a;html-docx-js进行前端导出 2.只兼容到word&#xff0c;wps兼容不太好 3.处理分页换行 4.处理页眉 index.tsx import { saveAs } from file-saver; import htmlToDocxGenerate from ./HtmlToDocx;const handleExportByHtml async () > {const expor…...

Linux基础 -- SSH 流式烧录与压缩传输笔记

Linux SSH 流式烧录与压缩传输指南 一、背景介绍 在嵌入式开发和维护中&#xff0c;常常需要通过 SSH 从 PC 向设备端传输大文件&#xff08;如系统镜像、固件&#xff09;并将其直接烧录到指定磁盘&#xff08;如 /dev/mmcblk2&#xff09;。然而&#xff0c;设备端存储空间…...

<论文>(微软)避免推荐域外物品:基于LLM的受限生成式推荐

一、摘要 本文介绍微软和深圳大学合作发表于2025年5月的论文《Avoid Recommending Out-of-Domain Items: Constrained Generative Recommendation with LLMs》。论文主要研究如何解决大语言模型&#xff08;LLMs&#xff09;在推荐系统中推荐域外物品的问题&#xff0c;提出了 …...

2025年渗透测试面试题总结-360[实习]安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 1. 自我介绍 2. WAF及其绕过方式 3. IPS/IDS/HIDS 4. 云安全 5. 绕过安骑士/安全狗 6. Gopher扩展…...

【机器学习】支持向量回归(SVR)从入门到实战:原理、实现与优化指南

前言 在机器学习的广阔领域中&#xff0c;回归分析作为预测连续型变量的重要手段&#xff0c;被广泛应用于金融预测、工业生产、科学研究等诸多场景。支持向量回归&#xff08;SVR&#xff09;作为回归算法家族中的佼佼者&#xff0c;凭借独特的理论优势与强大的实践能力脱颖而…...

右值引用的学习

传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用&#xff0c;都是给对象取别名。 左值引用和右值引用 在讲之前&#xff0c;我们先来看一下什么是左值和右值…...

碎片笔记|AI生成图像溯源方法源码复现经验(持续更新中……)

前言&#xff1a;本篇博客分享一些溯源方法的复现经验&#xff0c;希望能帮助到大家&#x1f389;。 目录 1. Close-set AttributionRepmixDe-FakeDNA-Net 2. Open-set AttributionPOSE 3. Single-Model AttributionOCC-CLIPLatentTracer 1. Close-set Attribution Repmix 论…...

elementplus el-tree 二次封装支持配置删除后展示展开或折叠编辑复选框懒加载功能

本文介绍了基于 ElementPlus 的 el-tree 组件进行二次封装的 TreeView 组件&#xff0c;使用 Vue3 和 JavaScript 实现。TreeView 组件通过 props 接收树形数据、配置项等&#xff0c;支持懒加载、节点展开/收起、节点点击、删除、编辑等操作。组件内部通过 ref 管理树实例&…...

【C/C++】深度探索c++对象模型_笔记

1. 对象内存布局 (1) 普通类&#xff08;无虚函数&#xff09; 成员变量排列&#xff1a;按声明顺序存储&#xff0c;但编译器会根据内存对齐规则插入填充字节&#xff08;padding&#xff09;。class Simple {char a; // 1字节&#xff08;偏移0&#xff09;int b; …...

Spring MVC数据绑定和响应 你了解多少?

数据绑定的概念 在程序运行时&#xff0c;Spring MVC接收到客户端的请求后&#xff0c;会根据客户端请求的参数和请求头等数据信息&#xff0c;将参数以特定的方式转换并绑定到处理器的形参中。Spring MVC中将请求消息数据与处理器的形参建立连接的过程就是Spring MVC的数据绑…...

外贸礼品禁忌

一、亚洲 1.印度 牛是神圣动物&#xff0c;别送牛皮制品。另外&#xff0c;左手不洁&#xff0c;送礼得用右手或双手。 2.日本 “梳” 和 “苦” 谐音&#xff0c;不送梳子。日本男性不咋佩戴首饰&#xff0c;除结婚戒指。礼物得装盒、纸包、绳饰&#xff0c;白色包装得有…...

【MySQL 基础篇】深入解析MySQL逻辑架构与查询执行流程

1 MySQL逻辑架构概述 MySQL 的逻辑架构主要分为 Server 层和存储引擎层两部分。 Server 层&#xff1a;包含连接器、查询缓存、分析器、优化器、执行器等组件。同时&#xff0c;所有的内置函数&#xff08;如日期、时间、数学和加密函数等&#xff09;也在这一层实现。此外&a…...