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

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后才开始判断早停。 早停参数设置 早停&#xff08;Early Stopping&#xff09;是一种常用的防止深度学习模型过拟合的方法。早停的设置需要根据具体情况进行调整&#xff0c;常见的做法是在模型训练过程中使用验证集&am…...

【Vue学习】Vue高级特性

1. 自定义v-model Vue中的自定义v-model指的是在自定义组件中使用v-model语法糖来实现双向绑定。在Vue中&#xff0c;通过v-model指令可以将表单元素的值与组件实例的数据进行双向绑定。但是对于自定义组件&#xff0c;如果要实现v-model的双向绑定&#xff0c;就需要自定义v-…...

Android 12.0 系统Settings去掉开发者模式功能

1.概述 在12.0的系统rom产品定制化开发中,在系统Settings中的关于手机的选项中,系统默认点击版本号5次会自动打开开发者模式,但是在某些产品开发过程中,禁止打开开发者模式,需要去掉开发者模式的功能,所以需要在系统Settings中查看开发者模式的相关流程代码,然后禁用掉开…...

buu [NCTF2019]babyRSA 1

题目描述&#xff1a; 题目分析&#xff1a; 首先明确两个公式&#xff1a; e*d 1 mod (p-1)(q-1) ed1 e*d - 1 k(p-1)(q-1)想要解出此题&#xff0c;我们必须知道n,而要知道n,我们要知道p和q的值通过 e*d 的计算&#xff0c;我们知道其长度为2066位&#xff0c;而生成p的…...

Java:如何选择一个Java API框架

Java编程语言是一种高级的、面向对象的语言&#xff0c;它使开发人员能够创建健壮的、可重用的代码。Java以其可移植性和平台独立性而闻名&#xff0c;这意味着Java代码可以在任何支持Java运行时环境(JRE)的系统上运行。Java和Node js一样&#xff0c;是一种功能强大的通用编程…...

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,…...

【深度学习】什么是线性回归逻辑回归单层神经元的缺陷

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录逻辑回归&线性回归单层神经元的缺陷单层神经元的缺陷逻辑回归&线性回归 线性回归预测的是一个连续值&#xff0c; 逻辑回归给出的”是”和“否”的回答. 等…...

Spring拦截器

SpringMVC提供了拦截器机制&#xff0c;允许运行目标方法之前进行一些拦截工作或者目标方法运行之后进行一下其他相关的处理。自定义的拦截器必须实现HandlerInterceptor接口。preHandle()&#xff1a;这个方法在业务处理器处理请求之前被调用&#xff0c;在该方法中对用户请求…...

8个可能降低网站搜索引擎信任度的错误

如果觉得文章对你有用请点赞与关注&#xff0c;每一份支持都是我坚持更新更优质内容的动力&#xff01;&#xff01;&#xff01;例如&#xff0c;发布一段质量差的网站内容不会完全破坏您的排名机会&#xff0c;只要您的内容策略的其余部分井井有条。但是本地SEO中存在一些错误…...

弱监督论文阅读:P2BNet算法笔记

标题&#xff1a;Point-to-Box Network for Accurate Object Detection via Single Point Supervision 会议&#xff1a;ECCV2022 论文地址&#xff1a;https://link.springer.com/10.1007/978-3-031-20077-9_4 官方代码&#xff1a;http://www.github.com/ucas-vg/P2BNet 作者…...

使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中&#xff0c;有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息。古人是用Oracle做数仓&#xff0c;理所当然是用SQL写UDF【虽然SQL写UDF给SQL用就像用鸡肉饲养肉…...

前端:分享JS中7个高频的工具函数

目录 ◆1、将数字转换为货币 ◆2、将 HTML 字符串转换为 DOM 对象 ◆3、防抖 ◆4、日期验证 ◆5、将 FormData&#xff08;表单数据&#xff09;转换为 JSON ◆6、衡量一个函数的性能 ◆7、从数组中删除重复项 JavaScript 实用函数是有用的、可重复使用的片段&#xff0…...

docker基础用法及镜像和容器的常用命令大全

1.docker 体系架构 Docker 采用了 C / S 架构&#xff0c;包括客户端和服务端。Docker 守护进程作为服务端接受来自客户端的请求&#xff0c;并处理这些请求&#xff08;创建、运行、分发容器&#xff09;。客户端和服务端既可以运行在一个机器上&#xff0c;也可通过 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接…...

什么是分布式锁?几种分布式锁分别是怎么实现的?

一、什么是分布式锁&#xff1a; 1、什么是分布式锁&#xff1a; 分布式锁&#xff0c;即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题&#xff0c;而分布式锁&#xff0c;就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是&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 一次顿悟的经历 体验一次顿悟 ​ 需求&#xff1a; ​为避免接收数据时一直阻塞&#xff0c;先调用 select 在一定时间内判断是否有数据可读 如果超时&#xff0c;就报错没读到数据&#xff0c;即使返回 如果仍然在 set 里&#xff0c;就调用 recv 函数接收数据 问…...

19_FreeRTOS软件定时器

目录 软件定时器介绍 FreeRTOS软件定时器特点 软件定时器的命令队列 软件定时器的相关配置 单次定时器和周期定时器 软件定时器结构体成员 FreeRTOS软件定时器相关API函数 实验源码 软件定时器介绍 定时器描述:从指定的时刻开始,经过一个指定时间,然后触发一个超时事件…...

值得推荐!安利5款良心又好用的小众软件

电脑上的各类软件有很多&#xff0c;除了那些常见的大众化软件&#xff0c;还有很多不为人知的小众软件&#xff0c;专注于实用功能&#xff0c;简洁干净、功能强悍。今天分享5个实用的软件&#xff0c;简单实用&#xff0c;效果拉满&#xff0c;堪称工作生活必备&#xff01; …...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 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...