Delphi RSA加解密(二)
dll开发环境: Delphi XE 10.1 Berlin
exe开发环境: Delphi 6
前提文章: Delphi RSA加解密(一)
目录
1. 概述
2. 准备工作
2.1 下载DEMO程序
2.2 字符编码说明
3. Cryption.dll封装
3.1 接口概况
3.2 uPub.pas单元代码
3.3 uInterface.pas单元代码
3.4 特别注意
4. 主程序模拟
4.1 程序目录结构说明
4.2 建立VCL应用程序
4.3 接口引入单元
4.4 接口加密验证
5. 结语
1. 概述
公司用D6来编写三方接口,当前做某银行转账接口,采用RSA算法。在上一篇文章Delphi RSA加解密(一)中在网上找到了解决方案。
D6版本低了,所有只有采用XE 10.1来封装dll。当前加密算法基于opelSSL,则依赖"libeay32.dll", 由于HIS程序目录下已有该dll,担心替换libeay32.dll会影响相关功能,特进行了特殊处理。
2. 准备工作
2.1 下载DEMO程序
在前提文章中提到了大佬分享的Demo. 下载后会发现bin目录有libeay32.dll。 这个文件很关键,后来我调试中,我使用XE 10.1对应的libeay32.dll文件,加密是不成功的。 但使用Demo的libeay32.dll进行加解密是正常的。
2.2 字符编码说明
原Demo的Delphi版本不确定,至少是D2010以后,版本太多了。
悲催的是,我只有XE 10.1,下了Demo后进行部分调整。
3. Cryption.dll封装
3.1 接口概况
该dll开发工具我使用Delphi XE 10.1 Berlin版本.
新建一个静态DLL工程,将原Demo的三个单元RSAOpenSSL.pas、libeay32.pas、EncdDecd_suman.pas拷贝到当前rsa目录下. 并加入当前dll工程. 另新建一个uPub.pas公共单元,新建一个uInterface.pas单元。工程目录如下

具体代码在后面,相信当前还在使用Delphi的,应该已能看懂的。
3.2 uPub.pas单元代码
unit uPub;interfaceusesSystem.SysUtils, System.Classes, qaes, qstring, IdHashMessageDigest, IdHash;typeTMD5= class(TIdHashMessageDigest5);TAppPara = classpublicclass function AppPath: string;class function AppName: string;end;TFilePath = class(TAppPara)publicclass function IniFile: string;end;//写日志
procedure systemLog(Msg: AnsiString);implementationprocedure systemLog(Msg: AnsiString);
varF: TextFile;FileName: string;ExeRoad: string;
begintryExeRoad := ExtractFilePath(ParamStr(0));if ExeRoad[Length(ExeRoad)] = '\' thenSetLength(ExeRoad, Length(ExeRoad) - 1);if not DirectoryExists(ExeRoad + 'log') thenbeginCreateDir(ExeRoad + '\log');end;FileName := ExeRoad + '\log\DLL_Log' + FormatDateTime('YYMMDD', NOW) + '.txt';if not FileExists(FileName) thenbeginAssignFile(F, FileName);ReWrite(F);endelseAssignFile(F, FileName);Append(F);Writeln(F, FormatDateTime('HH:NN:SS.zzz ', Now) + Msg);CloseFile(F);except//可能在事务中调用,避免意外Exit;end;
end;{ TAppPara }class function TAppPara.AppName: string;
beginResult := ExtractFileName(ParamStr(0));
end;class function TAppPara.AppPath: string;
beginResult := ExtractFilePath(ParamStr(0));
end;{ TFilePath }class function TFilePath.IniFile: string;
beginResult := AppPath + 'set.ini';
end;end.
3.3 uInterface.pas单元代码
需要注意,由于D6版本低,此处参数使用PAnsiChar。
unit uInterface;interfaceusesWinapi.Windows, System.SysUtils, System.Classes, EncdDecd, Qjson,RSAOpenSSL;varFRSAOpenSSL : TRSAOpenSSL;//----------------------------------测试部分------------------------------------
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//测试
function dll_test: Byte; stdcall;function dll_chinese_test(sIn: AnsiString; var sOut: PAnsiChar): Byte; stdcall;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//----------------------------------加密部分------------------------------------
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//RSA 加密 初始化
function dll_rsa_init(pubFile, priFile: PAnsiChar): Byte; stdcall;//RSA SHA1加密
function dll_sha1_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;//RSA SHA256加密
function dll_sha256_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;//RSA SHA512加密
function dll_sha512_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;//RSA SHA1WITHRSA 加密
function dll_sha1withrsa_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;//RSA SHA256WITHRSA 加密
function dll_sha256withrsa_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;//RSA SHA512WITHRSA 加密
function dll_sha512withrsa_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;//RSA 加密 释放
function dll_rsa_uninit: Byte; stdcall;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<implementationuses uPub, qaes;//----------------------------------测试部分------------------------------------
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//测试
function dll_test: Byte; stdcall;
beginResult:= 1;
end;function dll_chinese_test(sIn: AnsiString; var sOut: PAnsiChar): Byte; stdcall;
beginresult:= 0;sOut:= PAnsiChar(sIn);Result:= 1;
end;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//RSA 加密 初始化
function dll_rsa_init(pubFile, priFile: PAnsiChar): Byte; stdcall;
beginresult:= 0;if (not FileExists(priFile))or (not FileExists(pubFile)) thenExit;if not Assigned(FRSAOpenSSL) thenFRSAOpenSSL := TRSAOpenSSL.Create(AnsiString(pubFile), AnsiString(priFile));Result:= 1;
end;//RSA SHA1加密
function dll_sha1_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;
varsAnsiStr: AnsiString;sOut: AnsiString;
beginresult:= 0;sAnsiStr:= UTF8Encode(sIN);sOut:= FRSAOpenSSL.SHA1(sAnsiStr);pOut:= PAnsiChar(sOut);Result:= 1;
end;//RSA SHA256加密
function dll_sha256_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;
varsAnsiStr: AnsiString;sOut: AnsiString;
beginresult:= 0;sAnsiStr:= UTF8Encode(sIN);sOut:= FRSAOpenSSL.SHA256(sAnsiStr);pOut:= PAnsiChar(sOut);Result:= 1;
end;//RSA SHA512加密
function dll_sha512_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;
varsAnsiStr: AnsiString;sOut: AnsiString;
beginresult:= 0;sAnsiStr:= UTF8Encode(sIN);sOut:= FRSAOpenSSL.SHA512(sAnsiStr);pOut:= PAnsiChar(sOut);Result:= 1;
end;//RSA SHA1WITHRSA 加密
function dll_sha1withrsa_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;
varsAnsiStr: AnsiString;sOut: AnsiString;
beginresult:= 0;sAnsiStr:= UTF8Encode(sIn);sOut:= FRSAOpenSSL.SHA1_Sign_PK(sAnsiStr);pOut:= PAnsiChar(sOut);Result:= 1;
end;//RSA SHA256WITHRSA 加密
function dll_sha256withrsa_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;
varsAnsiStr: AnsiString;sOut: AnsiString;
beginresult:= 0;sAnsiStr:= UTF8Encode(sIn);sOut:= FRSAOpenSSL.SHA256_Sign_PK(sAnsiStr);pOut:= PAnsiChar(sOut);Result:= 1;
end;//RSA SHA512WITHRSA 加密
function dll_sha512withrsa_encrypt(sIn: PAnsiChar; var pOut: PAnsiChar): Byte; stdcall;
varsAnsiStr: AnsiString;sOut: AnsiString;
beginresult:= 0;sAnsiStr:= UTF8Encode(sIn);sOut:= FRSAOpenSSL.SHA512_Sign_PK(sAnsiStr);pOut:= PAnsiChar(sOut);Result:= 1;
end;//RSA 加密 释放
function dll_rsa_uninit: Byte; stdcall;
beginResult:= 0;if Assigned(FRSAOpenSSL) thenFreeAndNil(FRSAOpenSSL);Result:= 1;
end;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<end.
3.4 特别注意
在第四章我提到了程序目录(原因请看4.1),而libeay32.pas单元的第1290行,这个里引入了libeay32.dll,但是在,在我当前设计的目录里,Cryption.dll是和libeay32.dll放在程序目录下的bin目录下,通过Demo程序调用的话,程序认定的目录其实是程序根目录,所以在这里必须特殊处理下,加入路劲:
constLIBEAY_DLL_NAME = 'bin\libeay32.dll';
如果编写dll与主程序同一个目录,不担心加密的libeay32.dll影响的话,就放在程序目录下就可以了。
4. 主程序模拟
注意: SHA1WITHRSA、SHA256WITHRSA、SHA512WITHRSA需要公私钥的支持.
4.1 程序目录结构说明
在文章开始部分,我已说明使用Demo的libeay32.dll可能与主程序原本的libeay32.dll冲突,所以,第三章封装的Cryptiond.dll和libeay32.dll,以及可能用到的公私钥文件,我一起放在程序的某个目录下。

bin目录如下所示

4.2 建立VCL应用程序
丢下控件,界面如图所示:

主要是初始化时候,我指定了公私钥文件,就像Demo里窗体创建一样。
主窗体代码如下:
unit uFrmMain;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, EncdDecd;typeTForm2 = class(TForm)btn1: TButton;btn2: TButton;btn3: TButton;btn4: TButton;btn5: TButton;btn6: TButton;btn7: TButton;btn8: TButton;lbl1: TLabel;lbl2: TLabel;mmo_in: TMemo;mmo_out: TMemo;procedure btn1Click(Sender: TObject);procedure btn8Click(Sender: TObject);procedure btn2Click(Sender: TObject);procedure btn5Click(Sender: TObject);procedure btn3Click(Sender: TObject);procedure btn4Click(Sender: TObject);procedure btn6Click(Sender: TObject);procedure btn7Click(Sender: TObject);private{ Private declarations }public{ Public declarations }priFile: AnsiString;pubFile: AnsiString;end;varForm2: TForm2;iRet: Byte;implementationuses uCryption;{$R *.dfm}procedure TForm2.btn1Click(Sender: TObject);
beginiRet:= 0;pubFile:= 'bin\apprsakey.pub';priFile:= 'bin\apprsakey.pri';iRet:= dll_rsa_init(PChar(pubFile), PChar(priFile));if iRet<> 1 thenShowMessage('初始化失败!')
end;procedure TForm2.btn8Click(Sender: TObject);
beginiRet:= 0;iRet:= dll_rsa_uninit;if iRet= 1 thenShowMessage('释放成功!')elseShowMessage('释放失败!')
end;procedure TForm2.btn2Click(Sender: TObject);
varpOut: PChar;sIn: string;
beginsIn:= StringReplace(mmo_in.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);iRet:= 0;pOut:= nil;iRet:= dll_sha1_encrypt(PChar(sIn), pOut);if iRet=1 thenmmo_out.Lines.Add(pOut)elseShowMessage('dll_sha1_encrypt加密失败!');pOut:= nil;
end;procedure TForm2.btn5Click(Sender: TObject);
varpOut: PChar;sIn: string;
beginsIn:= StringReplace(mmo_in.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);iRet:= 0;pOut:= nil;iRet:= dll_sha1withrsa_encrypt(PChar(sIn), pOut);if iRet=1 thenmmo_out.Lines.Add(pOut)elseShowMessage('dll_sha1withrsa_encrypt加密失败!');pOut:= nil;
end;procedure TForm2.btn3Click(Sender: TObject);
varpOut: PChar;sIn: string;
beginsIn:= StringReplace(mmo_in.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);iRet:= 0;pOut:= nil;iRet:= dll_sha256_encrypt(PChar(sIn), pOut);if iRet=1 thenmmo_out.Lines.Add(pOut)elseShowMessage('dll_sha256_encrypt加密失败!');pOut:= nil;
end;procedure TForm2.btn4Click(Sender: TObject);
varpOut: PChar;sIn: string;
beginsIn:= StringReplace(mmo_in.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);iRet:= 0;pOut:= nil;iRet:= dll_sha512_encrypt(PChar(sIn), pOut);if iRet=1 thenmmo_out.Lines.Add(pOut)elseShowMessage('dll_sha512_encrypt加密失败!');pOut:= nil;
end;procedure TForm2.btn6Click(Sender: TObject);
varpOut: PChar;sIn: string;
beginsIn:= StringReplace(mmo_in.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);iRet:= 0;pOut:= nil;iRet:= dll_sha256withrsa_encrypt(PChar(sIn), pOut);if iRet=1 thenmmo_out.Lines.Add(pOut)elseShowMessage('dll_sha256withrsa_encrypt加密失败!');pOut:= nil;
end;procedure TForm2.btn7Click(Sender: TObject);
varpOut: PChar;sIn: string;
beginsIn:= StringReplace(mmo_in.Lines.Text,#13#10,'',[rfIgnoreCase,rfReplaceAll]);iRet:= 0;pOut:= nil;iRet:= dll_sha512withrsa_encrypt(PChar(sIn), pOut);if iRet=1 thenmmo_out.Lines.Add(pOut)elseShowMessage('dll_sha512withrsa_encrypt加密失败!');pOut:= nil;
end;end.
4.3 接口引入单元
需要注意dllName是按目录指定dll位置.
unit uCryption;interfaceusesClasses;constdllName= 'bin\Cryption.dll';function dll_chinese_test(sIn: AnsiString; var sOut: PAnsiChar): Byte; stdcall; external dllName;//RSA 加密 初始化function dll_rsa_init(pubFile, priFile: PChar): Byte; stdcall; external dllName;//RSA SHA1加密function dll_sha1_encrypt(sIn: PChar; var pOut: PChar): Byte; stdcall; external dllName;//RSA SHA256加密function dll_sha256_encrypt(sIn: PChar; var pOut: PChar): Byte; stdcall; external dllName;//RSA SHA512加密function dll_sha512_encrypt(sIn: PChar; var pOut: PChar): Byte; stdcall; external dllName;//RSA SHA1WITHRSA 加密function dll_sha1withrsa_encrypt(sIn: PChar; var pOut: PChar): Byte; stdcall; external dllName;//RSA SHA256WITHRSA 加密function dll_sha256withrsa_encrypt(sIn: PChar; var pOut: PChar): Byte; stdcall; external dllName;//RSA SHA512WITHRSA 加密function dll_sha512withrsa_encrypt(sIn: PChar; var pOut: PChar): Byte; stdcall; external dllName;//RSA 加密 释放function dll_rsa_uninit: Byte; stdcall; external dllName;implementationend.
4.4 接口加密验证
在线SHA1 SHA-1在线加密工具 与Demo加密对比

在线SHA256 sha256在线解密 在线加密 与Demo加密对比

在线SHA512可验证 sha512在线解密 在线加密 与Demo加密对比

另 SHA1WITHRSA、SHA256WITHRSA、SHA512WITHRSA在线验证不好找
后面我本地写个对照下看看,后面补充.
5. 结语
仅供参考。
相关文章:
Delphi RSA加解密(二)
dll开发环境: Delphi XE 10.1 Berlin exe开发环境: Delphi 6 前提文章: Delphi RSA加解密(一) 目录 1. 概述 2. 准备工作 2.1 下载DEMO程序 2.2 字符编码说明 3. Cryption.dll封装 3.1 接口概况 3.2 uPub.pas单元代码 3.3 uInterface.pas单元代码 3.4 特别注意 4. 主程序…...
pytorch 深度学习早停设置
当你设置早停的时候你需要注意的是你可能得在几个epoch后才开始判断早停。 早停参数设置 早停(Early Stopping)是一种常用的防止深度学习模型过拟合的方法。早停的设置需要根据具体情况进行调整,常见的做法是在模型训练过程中使用验证集&am…...
【Vue学习】Vue高级特性
1. 自定义v-model Vue中的自定义v-model指的是在自定义组件中使用v-model语法糖来实现双向绑定。在Vue中,通过v-model指令可以将表单元素的值与组件实例的数据进行双向绑定。但是对于自定义组件,如果要实现v-model的双向绑定,就需要自定义v-…...
Android 12.0 系统Settings去掉开发者模式功能
1.概述 在12.0的系统rom产品定制化开发中,在系统Settings中的关于手机的选项中,系统默认点击版本号5次会自动打开开发者模式,但是在某些产品开发过程中,禁止打开开发者模式,需要去掉开发者模式的功能,所以需要在系统Settings中查看开发者模式的相关流程代码,然后禁用掉开…...
buu [NCTF2019]babyRSA 1
题目描述: 题目分析: 首先明确两个公式: e*d 1 mod (p-1)(q-1) ed1 e*d - 1 k(p-1)(q-1)想要解出此题,我们必须知道n,而要知道n,我们要知道p和q的值通过 e*d 的计算,我们知道其长度为2066位,而生成p的…...
Java:如何选择一个Java API框架
Java编程语言是一种高级的、面向对象的语言,它使开发人员能够创建健壮的、可重用的代码。Java以其可移植性和平台独立性而闻名,这意味着Java代码可以在任何支持Java运行时环境(JRE)的系统上运行。Java和Node js一样,是一种功能强大的通用编程…...
mt6735 MIC 音量的调整及原理介绍
[DESCRIPTION] MIC 音量的调整及原理介绍[SOLUTION] audio_ver1_volume_custom_default.h#define VER1_AUD_VOLUME_MIC \ 64,112,192,144,192,192,184,184,184,184,184,0,0,0,0,\ 255,192,192,180,192,192,196,184,184,184,184,0,0,0,0,\ 255,208,208,180,255,208,196,0,0,0,0,…...
【深度学习】什么是线性回归逻辑回归单层神经元的缺陷
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录逻辑回归&线性回归单层神经元的缺陷单层神经元的缺陷逻辑回归&线性回归 线性回归预测的是一个连续值, 逻辑回归给出的”是”和“否”的回答. 等…...
Spring拦截器
SpringMVC提供了拦截器机制,允许运行目标方法之前进行一些拦截工作或者目标方法运行之后进行一下其他相关的处理。自定义的拦截器必须实现HandlerInterceptor接口。preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求…...
8个可能降低网站搜索引擎信任度的错误
如果觉得文章对你有用请点赞与关注,每一份支持都是我坚持更新更优质内容的动力!!!例如,发布一段质量差的网站内容不会完全破坏您的排名机会,只要您的内容策略的其余部分井井有条。但是本地SEO中存在一些错误…...
弱监督论文阅读:P2BNet算法笔记
标题:Point-to-Box Network for Accurate Object Detection via Single Point Supervision 会议:ECCV2022 论文地址:https://link.springer.com/10.1007/978-3-031-20077-9_4 官方代码:http://www.github.com/ucas-vg/P2BNet 作者…...
使用Java编写Hive的UDF实现身份证号码校验及15位升级18位
使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息。古人是用Oracle做数仓,理所当然是用SQL写UDF【虽然SQL写UDF给SQL用就像用鸡肉饲养肉…...
前端:分享JS中7个高频的工具函数
目录 ◆1、将数字转换为货币 ◆2、将 HTML 字符串转换为 DOM 对象 ◆3、防抖 ◆4、日期验证 ◆5、将 FormData(表单数据)转换为 JSON ◆6、衡量一个函数的性能 ◆7、从数组中删除重复项 JavaScript 实用函数是有用的、可重复使用的片段࿰…...
docker基础用法及镜像和容器的常用命令大全
1.docker 体系架构 Docker 采用了 C / S 架构,包括客户端和服务端。Docker 守护进程作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过 socket 或…...
Spring(Bean生命周期)
目录 1. 生命周期简图2. 扩展接口介绍 2.1 Aware接口2.2 BeanPostProcessor接口2.3 InitializingBean2.4 DisposableBean2.5 BeanFactoryPostProcessor接口3. spring的简化配置 3.1 项目搭建3.2 Bean的配置和值注入3.3 AOP的示例 1. 生命周期简图 2. 扩展接口介绍 2.1 Aware接…...
什么是分布式锁?几种分布式锁分别是怎么实现的?
一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是&am…...
【一天一门编程语言】R 语言程序设计极简教程
R 语言程序设计极简教程 文章目录 R 语言程序设计极简教程R语言简介1.1 介绍1.2 R 语言的基础知识1.2.1 语法1.2.2 数据类型1.2.3 基本操作1.3 R 语言的高级知识1.3.1 函数1.3.2 包1.3.3 面向对象编程1.4 使用 R 语言的实践1.4.1 数据处理1.4.2 数据可视化1.4.3 数据建模1.4.3.…...
记一次顿悟的经历
2023.02.20 一次顿悟的经历 体验一次顿悟 需求: 为避免接收数据时一直阻塞,先调用 select 在一定时间内判断是否有数据可读 如果超时,就报错没读到数据,即使返回 如果仍然在 set 里,就调用 recv 函数接收数据 问…...
19_FreeRTOS软件定时器
目录 软件定时器介绍 FreeRTOS软件定时器特点 软件定时器的命令队列 软件定时器的相关配置 单次定时器和周期定时器 软件定时器结构体成员 FreeRTOS软件定时器相关API函数 实验源码 软件定时器介绍 定时器描述:从指定的时刻开始,经过一个指定时间,然后触发一个超时事件…...
值得推荐!安利5款良心又好用的小众软件
电脑上的各类软件有很多,除了那些常见的大众化软件,还有很多不为人知的小众软件,专注于实用功能,简洁干净、功能强悍。今天分享5个实用的软件,简单实用,效果拉满,堪称工作生活必备! …...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
