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

安全邮件系统的Maple实现详解

代码改进版:

# =============================================
# 安全邮件系统实现 - 结合DES和RSA加密
# 功能:实现安全的消息加密、签名和传输
# =============================================# --------------------------
# 第一部分:消息准备和加密
# --------------------------# 原始消息内容
message := "This is an attempt to look at a reasonable way to send a message...";# 1. 消息预处理
# --------------------------
# 计算消息长度(字符数)
messLength := length(message);
# 计算需要的64位(8字节)块数量(向上取整)
messWords := ceil(messLength/8);
# 计算需要填充的字节数使消息长度为8的倍数
messPadding := 8*messWords - messLength;# 将消息转换为ASCII字节列表
messList := convert(message, bytes):
# 添加零填充使消息长度为8的倍数
messList := [op(messList),seq(0,i=1..messPadding)]:# 定义辅助函数:将整数转换为2位16进制字符串
intTo2Hex := intVal -> substring(convert(intVal+256,hex),2..3):# 将字节列表转换为16进制字符串列表
messHexList := map(intTo2Hex,messList):
# 将16进制列表分组为8字节(64位)的字
messHexWordList := [seq(cat(seq(messHexList[8*i+j],j=1..8)),i=0..messWords-1)]:# 2. DES加密准备
# --------------------------
# 生成随机64位DES密钥(16位16进制)
randKey := substring(convert(2^64+rand(2^64)(),hex),2..17); # 例如 "7778EEFFF432E596"
# 扩展DES密钥(生成16个子密钥)
key := keyexpander(randKey):# 3. DES-CBC模式加密
# --------------------------
# 初始化向量(IV) - 加密全零块作为IV
allZeroes := "0000000000000000";
IV := qdDEShex(allZeroes,key);# 创建表存储密文块
cipherTable := table():
# 加密第一个块: E(P1 XOR IV)
cipherTable[1] := qdDEShex(xor64hex(IV,messHexWordList[1]),key);
# 加密后续块: E(Pi XOR C(i-1))
for i from 2 to messWords docipherTable[i] := qdDEShex(xor64hex(cipherTable[i-1],messHexWordList[i]),key):
od:# 将密文表转换为列表
cipherList := [seq(cipherTable[i],i=1..messWords)];# --------------------------
# 第二部分:数字签名
# --------------------------# 4. 使用RSA创建数字签名
# 使用最后一个密文块作为消息摘要
hash := cipherList[messWords];  # 例如 "7C54E08D43AEC1AF"# 生成发送方的RSA密钥对
# 选择两个大素数(约80位)
p := nextprime(rand(10^80)());
q := nextprime(rand(10^80)());
# 计算模数n
Sendern := p*q;
# 公钥指数(通常选择65537)
Sendere := 2^16+1;
# 计算私钥指数d ≡ e⁻¹ mod (p-1)(q-1)
Senderd := (1/Sendere) mod ((p-1)*(q-1));# 将哈希值转换为十进制大整数
digestNum := convert(hash, decimal, hex);
# 使用私钥签名: S = H^d mod n
signature := Power(digestNum,Senderd) mod Sendern;
# 将签名转换为16进制
sigHex := convert(signature, hex);# --------------------------
# 第三部分:会话密钥加密
# --------------------------# 5. 使用接收方公钥加密DES会话密钥
# 假设已获得接收方公钥 (Receivere, Receivern)
# 将DES密钥转换为十进制大整数
keyNum := convert(randKey, decimal, hex);
# 使用接收方公钥加密: C = K^e mod n
encryptKey := Power(keyNum, Receivere) mod Receivern:
# 将加密后的密钥转换为16进制
encryptKeyHex := convert(encryptKey, hex);# 现在可以安全传输以下数据:
# 1. cipherList - 加密的消息
# 2. sigHex - 数字签名
# 3. encryptKeyHex - 加密的DES密钥
# 4. 发送方公钥 (Sendere, Sendern)# =============================================
# 第四部分:解密过程
# =============================================# 1. 验证数字签名
# --------------------------
# 将签名转换回十进制
signature := convert(sigHex, decimal, hex):
# 使用发送方公钥验证签名: H' = S^e mod n
sigD := Power(signature,Sendere) mod Sendern;
# 将结果转换为16进制字符串
hashRecover := substring(convert(2^64+sigD,hex),2..17);# 验证签名是否匹配
if hashRecover = cipherList[messWords] thenprint("签名验证成功 - 消息来自可信发送方且未被篡改");
elseprint("签名验证失败 - 消息可能被篡改或来源不可信");
fi;# 2. 恢复DES会话密钥
# --------------------------
# 将加密的密钥转换回十进制
encryptKey := convert(encryptKeyHex,decimal,hex):
# 使用接收方私钥解密: K = C^d mod n
keyNum := Power(encryptKey, Receiverd) mod Receivern:
# 将解密后的密钥转换为16进制字符串
sessionKey := substring(convert(keyNum + 2^64, hex),2..17); # 应与原始randKey相同# 3. DES-CBC模式解密
# --------------------------
# 扩展DES密钥
key := keyexpander(sessionKey):
# 重新生成初始化向量(与加密时相同)
IV := qdDEShex("0000000000000000",key):# 创建表存储解密后的明文块
plainTable := table():
# 解密第一个块: P1 = D(C1) XOR IV
plainTable[1] := xor64hex(unDEShex(cipherList[1],key), IV):
# 解密后续块: Pi = D(Ci) XOR C(i-1)
for i from 2 to messWords doplainTable[i] := xor64hex(unDEShex(cipherList[i],key), cipherList[i-1]);
od:# 将解密后的块转换为列表
plainList := [seq(plainTable[i],i=1..messWords)];# 4. 转换为原始消息
# --------------------------
# 将每个16进制字转换为8个字节
plainListBytes := map(x -> seq(convert(substring(x,2*i+1..2*i+2),decimal,hex),i=0..7), plainList):
# 将字节列表转换为ASCII字符
received := convert(plainListBytes,bytes);# 移除填充的零字节
received := received[1..messLength];# 输出解密结果
print("解密后的原始消息:");
convert(received,bytes);# =============================================
# 辅助函数说明(需要预先实现):
# 
# 1. keyexpander(key) - DES密钥扩展算法
#    输入: 64位密钥(16位16进制字符串)
#    输出: 16个48位子密钥
#
# 2. qdDEShex(block, key) - DES加密函数
#    输入: 64位数据块和扩展后的密钥
#    输出: 64位密文块
#
# 3. unDEShex(block, key) - DES解密函数
#    输入: 64位密文块和扩展后的密钥
#    输出: 64位明文块
#
# 4. xor64hex(a, b) - 64位16进制字符串异或
#    输入: 两个64位(16字符)16进制字符串
#    输出: 异或结果(16字符16进制字符串)
# =============================================

系统概述

目标


1. 通过开放信道安全发送加密消息
2. 防止窃听
3. 接收方能验证发送方身份
4. 确保消息未被篡改(完整性和真实性)

技术组合


- **DES**:对称块加密算法,用于加密消息内容
- **RSA**:公钥加密算法,用于加密会话密钥和数字签名

加密过程详解

1. 准备消息


```maple
message := "This is an attempt to look at a reasonable way to send a message...";
```
消息包含说明文本,描述了该系统的工作原理。

 2. DES加密准备


```maple
messLength := length(message);          // 计算消息长度(577字符)
messWords := ceil(messLength/8);        // 计算需要的64位字数量(73个)
messPadding := 8*messWords - messLength; // 计算需要填充的字节数(7个)
```

将消息转换为字节列表并填充:
```maple
messList := convert(message, bytes):
messList := [op(messList),seq(0,i=1..messPadding)]:
```

转换为16进制表示:
```maple
intTo2Hex := intVal -> substring(convert(intVal+256,hex),2..3):
messHexList := map(intTo2Hex,messList):
messHexWordList := [seq(cat(seq(messHexList[8*i+j],j=1..8)),i=0..messWords-1)]:
```

3. DES-CBC模式加密


生成随机DES密钥:
```maple
randKey := substring(convert(2^64+rand(2^64)(),hex),2..17); // "7778EEFFF432E596"
```

初始化向量(IV):
```maple
allZeroes := "0000000000000000";
IV := qdDEShex(allZeroes,key);  // 加密全零块作为IV
```

执行CBC模式加密:
```maple
cipherTable[1] := qdDEShex(xor64hex(IV,messHexWordList[1]),key);
for i from 2 to messWords do
  cipherTable[i] := qdDEShex(xor64hex(cipherTable[i-1],messHexWordList[i]),key):
od:
```

4. 数字签名


使用RSA对消息哈希(最后一个密文块)签名:
```maple
hash := cipherList[messWords];  // "7C54E08D43AEC1AF"

// 生成RSA密钥对
p := nextprime(rand(10^80)());  // 大素数p
q := nextprime(rand(10^80)());  // 大素数q
Sendern := p*q;                 // 模数n
Sendere := 2^16+1;              // 公钥指数e
Senderd := (1/Sendere) mod ((p-1)*(q-1)); // 私钥d

// 对哈希签名
digestNum := convert(hash, decimal, hex);
signature := Power(digestNum,Senderd) mod Sendern;
sigHex := convert(signature, hex);
```

5. 加密会话密钥


//使用接收方的公钥加密DES会话密钥:
keyNum := convert(randKey, decimal, hex);
encryptKey := Power(keyNum, Receivere) mod Receivern:
encryptKeyHex := convert(encryptKey, hex);
 

解密过程详解

 1. 验证签名

//验证签名
signature := convert(sigHex, decimal, hex):
sigD := Power(signature,Sendere) mod Sendern;  // 使用发送方公钥验证
hashRecover := substring(convert(2^64+sigD,hex),2..17);
 

2. 恢复会话密钥


//恢复会话密钥
encryptKey := convert(encryptKeyHex,decimal,hex):
keyNum := Power(encryptKey, Receiverd) mod Receivern:  // 使用接收方私钥解密
sessionKey := substring(convert(keyNum + 2^64, hex),2..17); // "7778EEFFF432E596"
 

3. DES-CBC模式解密

//DES-CBC模式解密
key := keyexpander(sessionKey):
IV := qdDEShex("0000000000000000",key):

// CBC模式解密
plainTable[1] := xor64hex(unDEShex(cipherList[1],key), IV):
for i from 2 to messWords do
  plainTable[i] := xor64hex(unDEShex(cipherList[i],key), cipherList[i-1]);
od:

// 转换回原始消息
plainListBytes := map(x -> seq(convert(substring(x,2*i+1..2*i+2),decimal,hex),i=0..7), plainList):
received := convert(plainListBytes,bytes);
 

## 练习题目

1. 解密给定消息并验证签名,然后构造加密回复
2. 创建自己的10行消息,生成DES和RSA密钥,完成加密和签名过程
3. 测试自己的消息能否正确解密
4. 与同学交换公钥,实现安全邮件通信

## 技术要点总结

1. **混合加密系统**:结合DES(高效)和RSA(安全密钥交换)
2. **CBC模式**:增加加密安全性,防止模式分析
3. **数字签名**:使用RSA确保消息真实性和完整性
4. **密钥管理**:会话密钥随机生成,用接收方公钥加密
5. **填充处理**:确保消息长度符合DES块大小要求

相关文章:

安全邮件系统的Maple实现详解

代码改进版: # # 安全邮件系统实现 - 结合DES和RSA加密 # 功能:实现安全的消息加密、签名和传输 # # -------------------------- # 第一部分:消息准备和加密 # --------------------------# 原始消息内容 message : "This is an atte…...

VTK-8.2.0源码编译(Cmake+VS2022+Qt5.12.12)

参考: 安装VTK 详细图文讲解CMake编译VTK,包含详细的编译环境版本 Visual Studio 2022 配置VTK9.3.0 VTK-8.2.0源码编译和初步使用(CmakeVS2015Qt5.14.2) 文章目录 下载编译编译环境介绍配置CMake信息BUILD_SHARED_LIBS控制生成的库是动态链接库&#xf…...

【playwright】学习--持续汇总

seleniumplaywrightselenium 需要结合其他自动化框架,比如pytest之后才能支持web自动化测试playwright 不需要其他自动化框架selenium库》webdriver》浏览器驱动playwright库》playwright driver》浏览器驱动 目录 安装playwright通过pip安装通过VScode安装 安装pla…...

深度解析算法之模拟

39.替换所有的问号 题目链接 给你一个仅包含小写英文字母和 ? 字符的字符串 s,请你将所有的 ? 转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。 注意:你 不能 修改非 ? 字符。 题目测试用例保证 除 ? 字符 之外&#…...

leetcode刷题日记——插入区间

[ 题目描述 ]: [ 思路 ]: intervals 有序,需要将一个新的范围插入,然后进行整合方法一,将新的范围插入原 intervals 区间,然后使用 56 题的合并区间函数直接解决方法二, 找出能够包容 newInte…...

gbase8s存储学习一 rootdbs存储结构以及寻址分析

主要层次自下而上为 最小物理存储单元page ,多个page 组成逻辑存储单元extent,多个extent 组成物理存储单元chunk ,而多个chunk组成逻辑存储单元dbspace,多个dbspace 组成一个数据库实例 在数据库初始化阶段会生成一个rootdbs表空间,该表空…...

学习设计模式《五》——工厂方法模式

一、基础概念 工厂方法模式的本质是【延迟到子类来选择实现】; 工厂方法模式的定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类的实例化延迟到其子类 。 工厂方法模式的功能 序号说明0工厂方法模…...

如何将 Azure Active Directory (Azure AD) 作为 SAML IdP 对接到 Keycloak

✅ 一、在 Azure AD 创建 SAML 应用 🔧 1. 登录 Azure 门户 前往 https://portal.azure.com,使用管理员账号登录。 📌 2. 创建企业应用(Enterprise Application) 左侧菜单进入 “企业应用程序”。点击 “新建应用程…...

OCR之身份证识别

前言 OCR身份证识别是光学字符识别技术在身份证领域的应用。通过扫描或拍照获取身份证图像,利用图像处理、深度学习等技术,自动提取姓名、性别、民族、出生日期、地址、身份证号等信息,可大幅提升信息录入效率,广泛应用于政务、金…...

JavaScript 渲染内容爬取:Puppeteer 高级技巧与实践

在现代网络应用中,动态网页内容的爬取一直是开发者面临的挑战之一。Puppeteer 作为一种强大的浏览器自动化工具,为这一问题提供了优雅的解决方案。本文将深入探讨 Puppeteer 的高级技巧,包括动态内容抓取、性能优化、反检测与伪装、复杂自动化…...

组织级项目管理OPM

组织级项目管理(Organizational Project Management, OPM)是一种系统化的管理方法,旨在通过整合项目组合、项目集和项目管理,确保组织的战略目标与项目执行的一致性,提升资源利用效率和项目成功率。以下是其核心内容与框架的详述: 一、组织级项目管理的定义与目标 定义 组…...

HTML与Web 性能优化:构建高速响应的现代网站

HTML 与 Web 性能优化:构建高速响应的现代网站 引言 随着互联网用户对网站加载速度期望的不断提高,前端性能优化已经成为现代 Web 开发的核心竞争力。据 Google 研究表明,页面加载时间每增加 1 秒,用户跳出率就会增加 32%。用户…...

模型 观测者效应

系列文章分享模型,了解更多👉 模型_思维模型目录。观察即影响,存在因注视而变。 1 观测者效应的应用 1.1 工业心理学—霍桑实验中的生产效率谜题 行业背景:20世纪20年代西方电气公司霍桑工厂,研究者试图通过优化照明…...

Ubuntu启动SMB(Samba)服务步骤

目录 1.基本的Samba服务器搭建流程主要分为四个步骤。 2.Samba工作流程: 3.解读主要配置文件smb.conf 4.开始安装Samba 5.检查Samba服务状态 6.创建Samba共享文件夹 7.配置Samba文件以及设置Samba用户密码 8.重启Samba服务器 9.关闭防火墙 10.Linux客户端…...

使用react的ant-design-pro框架写一个地图组件,可以搜索地图,可以点击地图获取点击的位置及经纬度

首先,先创建一个地图页面,用于显示地图组件,我是在pages文件中创建了一个mapSearch组件。 然后在routes.ts中注册页面。 {path: /mapSearch,name: mapSearch,icon: smile,component: ./mapSearch,}, 第三步就是使用高德地图来创建地图。 关键…...

【每日八股】复习计算机网络 Day4:TCP 协议的其他相关问题

文章目录 昨日内容复习已经建立了 TCP 连接,客户端突然出现故障怎么办?什么时候用长连接?短连接?TCP 的半连接队列与全连接队列?什么是 SYN 攻击?如何避免?TIME_WAIT 的作用?过多如何…...

Git远程操作与标签管理

目录 1.理解分布式版本控制系统 2.远程仓库 3.新建远程仓库 4.克隆远程仓库 5.向远程仓库推送 6.拉取远程仓库 7.配置Git 7.1.忽略特殊文件 7.2.给命令配置别名 8.标签管理 8.1.理解标签 8.2.创建标签 8.3.操作标签 1.理解分布式版本控制系统 Git是目前世界上…...

Element Plus消息通知体系深度解析:从基础到企业级实践

一、核心组件与技术定位 Element Plus的消息通知体系由三个核心组件构成:ElMessage(全局提示)、ElNotification(通知弹窗)和ElMessageBox(交互式对话框)。这套体系的设计目标是为开发者提供轻量…...

SpringCloud组件——Eureka

一.背景 1.问题提出 我们在一个父项目下写了两个子项目,需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源,具体实现的方法有很多,可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 举个例子&#x…...

[Godot] C#2D平台游戏基础移动和进阶跳跃代码

本文章给大家分享一下如何实现基本的移动和进阶的跳跃(跳跃缓冲、可变跳跃、土狼时间)以及相对应的重力代码,大家可以根据自己的需要自行修改 实现效果 场景搭建 因为Godot不像Unity,一个节点只能绑定一个脚本,所以我…...

C语言对n进制的处理

先看一道题目: 从键盘获取一个正整数,如果把它转为16进制的数字,那么它是一个几位数呢?如果把它转为28进制又是一个几位数呢? 在讲这个题目之前,我们先要了解进制转换 什么是进制转换? 简单来说,进制就是数位的表示方法。 十进制(常用&am…...

rk3568main.cc解析

rk3568main.cc解析 前言解析总结前言 正点原子rk3568学习,rk官方RKNN_MODEL_ZOO文件中 rknn_model_zoo-main/examples/mobilenet/cpp/main.cc 从执行命令:./build-linux.sh -t rk3568 -a aarch64 -d mobilenet 到: cmake ../../examples/mobilenet/cpp \-DTARGET_SOC=rk3…...

【白雪讲堂】[特殊字符]内容战略地图|GEO优化框架下的内容全景布局

📍内容战略地图|GEO优化框架下的内容全景布局 1️⃣ 顶层目标:GEO优化战略 目标关键词: 被AI理解(AEO) 被AI优先推荐(GEO) 在关键场景中被AI复读引用 2️⃣ 三大引擎逻辑&#x…...

S32K144学习(16)-Bootloader

1.什么是bootloader Bootloader(引导加载程序) 是存储在设备非易失性存储器(如 ROM、Flash)中的一段特殊程序,负责在设备上电后初始化硬件、加载操作系统(OS)或用户应用程序,并最终…...

反素数c++

先上代码 #include<bits/stdc.h> using namespace std; typedef long long ll; ll n; ll p[]{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}; int maxd,maxval; void dfs(int pl,ll tmp,int num,int up){ if((num>maxd)||(nummaxd&&maxval>tmp)){ …...

C++ linux打包运行方案(cmake)

文章目录 背景动态库打包方案动态库转静态库动态库打到软件包中 运行 背景 使用C编写的一个小项目&#xff0c;需要打包成ubuntu下的可执行文件&#xff0c;方便分发给其他ubuntu执行&#xff0c;因为docker镜像方案过于臃肿&#xff0c;所以需要把项目的动态库都打在软件包中…...

JavaScript 渲染内容爬取实践:Puppeteer 进阶技巧

进一步探讨如何使用 Puppeteer 进行动态网页爬取&#xff0c;特别是如何等待页面元素加载完成、处理无限滚动加载、单页应用的路由变化以及监听接口等常见场景。 一、等待页面元素加载完成 在爬取动态网页时&#xff0c;确保页面元素完全加载是获取完整数据的关键。Puppeteer…...

AI数字人:元宇宙舞台上的闪耀新星(7/10)

摘要&#xff1a;AI数字人作为元宇宙核心角色&#xff0c;提升交互体验&#xff0c;推动内容生产变革&#xff0c;助力产业数字化转型。其应用场景涵盖虚拟社交、智能客服、教育、商业营销等&#xff0c;面临技术瓶颈与行业规范缺失等挑战&#xff0c;未来有望突破技术限制&…...

测试基础笔记第九天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、数据类型和约束1.数据类型2.约束3.主键4.不为空5.唯一6.默认值 二、数据库操作1.创建数据库2.使用数据库3.修改数据库4.删除数据库和查看所有数据库5.重点&…...

C++抽象基类定义与使用

在 C 中&#xff0c;抽象基类&#xff08;Abstract Base Class, ABC&#xff09; 是一种特殊的类&#xff0c;用于定义接口规范和约束派生类的行为。它通过纯虚函数&#xff08;Pure Virtual Function&#xff09;强制要求派生类实现特定功能&#xff0c;自身不能被实例化。以下…...

20.4 显示数据库数据

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 20.4.1 设计时进行简单绑定 【例 20.22】【项目&#xff1a;code20-022】设计时关联数据库。 设计时设置DataGridView的DataSource属…...

PyTorch 多 GPU 入门:深入解析 nn.DataParallel 的工作原理与局限

当你发现单个 GPU 已经无法满足你训练庞大模型或处理海量数据的需求时&#xff0c;利用多 GPU 进行并行训练就成了自然的选择。PyTorch 提供了几种实现方式&#xff0c;其中 torch.nn.DataParallel (简称 DP) 因其使用的便捷性&#xff0c;常常是初学者接触多 GPU 训练的第一站…...

UDP协议理解

文章目录 UDP协议理解UDP 协议的特点&#xff1a;UDP协议图示UDP 的头部结构&#xff1a;UDP数据传输图示 UDP 的应用场景&#xff1a;TCP 与UDP对比UDP的传输丢包和顺序错乱问题&#xff08;了解&#xff09;丢包的解决方法&#xff1a;顺序错乱的解决方法&#xff1a;综合应用…...

微信小程序拖拽排序有效果图

效果图 .wxml <view class"container" style"--w:{{w}}px;" wx:if"{{location.length}}"><view class"container-item" wx:for"{{list}}" wx:key"index" data-index"{{index}}"style"--…...

算力网络的早期有关论文——自用笔记

2023年底至2024年初阅读有关论文的自用笔记&#xff0c;作为参考。 算力网络架构 https://baijiahao.baidu.com/s?id1727377583404975414&wfrspider&forpc think&note 是否可以和cpu进程调度联系。 目前&#xff1a;看一些综述深一步了解背景和发展现状,完善认…...

卷积神经网络基础(四)

今天我们继续学习各个激活函数层的实现过程。 目录 5.2 Sigmoid层 六、Affine/Softmax层实现 6.1 Affine层 6.2 批处理版本 5.2 Sigmoid层 sigmoid函数的表达式如下&#xff1a; 用计算图表示的话如下&#xff1a; 计算过程稍微有些复杂&#xff0c;且这里除了乘法和加法…...

【MySQL数据库】表的约束

目录 1&#xff0c;空属性 2&#xff0c;默认值 3&#xff0c;列描述 4&#xff0c;zerofill 5&#xff0c;主键primary key 6&#xff0c;自增长auto_increment 7&#xff0c;唯一键unique 8&#xff0c;外键foreign key 在MySQL中&#xff0c;表的约束是指用于插入的…...

网络威胁情报 | Friday Overtime Trooper

本文将分别从两个环境出发&#xff0c;以实践来体验利用威胁情报分析可疑文件的过程。 Friday Overtime 现在你是一位安全分析人员&#xff0c;正在美美等待周五过去&#xff0c;但就在即将下班之时意外发生了&#xff1a;你的客户发来求助&#xff0c;说他们发现了一些可疑文…...

GPIO(通用输入输出端口)详细介绍

一、基本概念 GPIO&#xff08;General - Purpose Input/Output&#xff09;即通用输入输出端口&#xff0c;是微控制器&#xff08;如 STM32 系列&#xff09;中非常重要的一个外设。它是一种软件可编程的引脚&#xff0c;用户能够通过编程来控制这些引脚的输入或输出状态。在…...

学习笔记——《Java面向对象程序设计》-继承

参考教材&#xff1a; Java面向对象程序设计&#xff08;第3版&#xff09;微课视频版 清华大学出版社 1、定义子类 class 子类名 extends 父类名{...... }如&#xff1a; class Student extends People{...... } &#xff08;1&#xff09;如果一个类的声明中没有extends关…...

基于javaweb的SpringBoot校园失物招领系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

什么事Nginx,及使用Nginx部署vue项目(非服务器Nginx压缩包版)

什么是 Nginx? Nginx(发音为 “engine-x”)是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。它以其高性能、高并发处理能力和低资源消耗而闻名。以下是 Nginx 的主要特性和用途: 主要特性 高性能和高并发 Nginx 能够处理大量并发连接,适合高…...

nodejs使用require导入npm包,开发依赖和生产依赖 ,全局安装

nodejs使用require导入npm包&#xff0c;开发依赖和生产依赖 &#xff0c;全局安装 ✅ 一、Node.js 中使用 require() 导入 npm 包 // 导入第三方包&#xff08;例如 axios&#xff09; const axios require(axios);// 使用 axios.get(https://api.example.com).then(res &g…...

CSS在线格式化 - 加菲工具

CSS在线格式化 打开网站 加菲工具 选择“CSS在线格式化” 或者直接访问 https://www.orcc.top/tools/css 输入CSS代码&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果...

图片转base64 - 加菲工具 - 在线转换

图片转base64 - 加菲工具 先进入“加菲工具” 网 打开 https://www.orcc.top&#xff0c; 选择 “图片转base64”功能 选择需要转换的图片 复制 点击“复制”按钮&#xff0c;即可复制转换好的base64编码数据&#xff0c;可以直接用于img标签。...

性能比拼: Redis vs Dragonfly

本内容是对知名性能评测博主 Anton Putra Redis vs Dragonfly Performance (Latency - Throughput - Saturation) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中&#xff0c;我们将对比 Redis 和 Dragonfly。我们将观察 set 与 get 操作的延迟&#xff…...

如何收集用户白屏/长时间无响应/接口超时问题

想象一下这样的场景:一位用户在午休时间打开某电商应用,准备购买一件心仪已久的商品。然而,页面加载了数秒后依然是一片空白,或者点击“加入购物车”按钮后没有任何反馈,甚至在结算时接口超时导致订单失败。用户的耐心被迅速消耗殆尽,关闭应用,转而选择了竞争对手的产品…...

来啦,烫,查询达梦表占用空间

想象一下oracle&#xff0c;可以查dba_segments&#xff0c;但是这个不可靠&#xff08;达梦官方连说明书都没有&#xff09; 先拼接一个sql set lineshow off SELECT SELECT ||||OWNER|||| AS OWNER,||||TABLE_NAME|||| AS TABLE_NAME,TABLE_USED_SPACE(||||OWNER||||,||||T…...

# 利用迁移学习优化食物分类模型:基于ResNet18的实践

利用迁移学习优化食物分类模型&#xff1a;基于ResNet18的实践 在深度学习的众多应用中&#xff0c;图像分类一直是一个热门且具有挑战性的领域。随着研究的深入&#xff0c;我们发现利用预训练模型进行迁移学习是一种非常有效的策略&#xff0c;可以显著提高模型的性能&#…...

AT24C02芯片简介:小巧强大的串行EEPROM存储器

一、AT24C02概述 AT24C02是一款2K位&#xff08;即256字节&#xff09;的串行EEPROM芯片&#xff0c;采用IC&#xff08;Inter-Integrated Circuit&#xff09;总线进行通信&#xff0c;适合低功耗、小容量存储需求。 主要特性&#xff1a; 项目 参数 存储容量 2Kb&#x…...