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

C++课设:实现简易文件加密工具(凯撒密码、异或加密、Base64编码)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
专栏介绍:《编程项目实战》

目录

    • 一、初识文件加密:为什么需要保护我们的文件?
      • 1. 加密的基本概念
      • 2. 为什么选择这三种算法?
    • 二、工具介绍:三大经典加密算法一网打尽
      • 1. 凯撒密码(Caesar Cipher)
      • 2. 异或加密(XOR Encryption)
      • 3. Base64编码
      • 4. 环境兼容性说明
    • 三、核心代码实现:手把手教你构建加密工具
    • 四、实战演练:从入门到精通的使用指南
      • 1. 环境准备
      • 2. 实战举例
      • 3. 常见问题解决
    • 五、算法深度解析:揭秘加密背后的数学原理
      • 1. 凯撒密码的数学本质
      • 2. 异或运算的神奇特性
      • 3. Base64的编码奥秘
    • 六、总结与展望:安全编程的下一步
      • 1. 学习收获
      • 2. 安全性说明
      • 3. 进阶方向

在数字化时代,数据安全变得越来越重要。今天我们将用C++从零构建一个简易但功能完善的文件加密工具,支持凯撒密码异或加密Base64编码三种经典算法,兼容Dev C++ 5.11环境。

一、初识文件加密:为什么需要保护我们的文件?

想象一下,你有一份重要的文档,里面记录着你的日记、密码或者商业机密。如果这个文件被别人轻易打开,后果不堪设想。这时候,文件加密就像给你的文件上了一把锁,只有知道密码的人才能打开。

计算机安全和数据隐私是现代应用程序设计中至关重要的方面。为了确保数据的机密性和完整性,常常需要使用加密和解密算法。

在这里插入图片描述

1. 加密的基本概念

加密是将可读的明文转换为不可读的密文的过程,而解密则是相反的过程。就像:

  • 明文Hello World!
  • 密文Khoor Zruog!(凯撒加密,位移3)

2. 为什么选择这三种算法?

  • 凯撒密码:是已知最早的代替密码,通过对字母进行固定偏移量的移位操作来加密和解密消息,简单易懂,适合入门学习
  • 异或加密:基于异或运算的简单且常见的加密技术,简单性和高效性使得它在某些场景下很有用
  • Base64编码:用于将二进制数据转换成可打印的ASCII字符串,广泛应用于数据传输和存储领域

二、工具介绍:三大经典加密算法一网打尽

我们的加密工具支持三种不同的加密方式,每种都有其独特的特点和应用场景。

在这里插入图片描述

1. 凯撒密码(Caesar Cipher)

凯撒密码是一种最简单且最广为人知的加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移。

工作原理

  • 将字母表中的每个字母向右移动固定位数
  • 例如:位移3时,A→D, B→E, C→F
  • 到达字母表末尾时循环回到开头:X→A, Y→B, Z→C

2. 异或加密(XOR Encryption)

异或加密使用异或运算(XOR),它有一个神奇的特性:A XOR B XOR B = A,这意味着加密和解密可以使用同一个操作!

工作原理

  • 将文本中的每个字符与密钥字符进行异或运算
  • 密钥循环使用:如果密钥比文本短,就重复使用
  • 同样的密钥既能加密也能解密

3. Base64编码

Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,虽然不是真正意义上的加密,但可以将文件内容转换为看起来像乱码的字符串。

工作原理

  • 将3个8位字节转换为4个6位字节
  • 使用64个可打印字符表示数据
  • 输出结果可能包含=作为填充字符

4. 环境兼容性说明

Dev-C++ 5.11使用MingW64/TDM-GCC编译器,遵循C++11标准,兼容C++98标准。我们的代码严格按照C++98标准编写,确保在Dev-C++ 5.11环境下完美运行。主要兼容性特点:

  • 使用传统的stringvector等STL容器
  • 避免使用C++11及以后的新特性
  • 采用经典的for循环语法
  • 使用.c_str()进行字符串转换

三、核心代码实现:手把手教你构建加密工具

下面是完整的C++代码实现,兼容Dev C++ 5.11:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>using namespace std;class FileEncryption {
private:// Base64编码表static const string base64_chars;// 判断字符是否为Base64字符static bool is_base64(unsigned char c) {return (isalnum(c) || (c == '+') || (c == '/'));}public:// 凯撒加密static string caesarEncrypt(const string& text, int shift) {string result = "";for (size_t i = 0; i < text.length(); i++) {char c = text[i];if (isalpha(c)) {char base = islower(c) ? 'a' : 'A';c = ((c - base + shift) % 26) + base;}result += c;}return result;}// 凯撒解密static string caesarDecrypt(const string& text, int shift) {return caesarEncrypt(text, 26 - shift);}// 异或加密/解密(异或运算是可逆的)static string xorEncrypt(const string& text, const string& key) {string result = "";for (size_t i = 0; i < text.length(); i++) {result += char(text[i] ^ key[i % key.length()]);}return result;}// Base64编码static string base64Encode(const string& text) {string ret;int i = 0;int j = 0;unsigned char char_array_3[3];unsigned char char_array_4[4];const char* bytes_to_encode = text.c_str();int in_len = text.length();while (in_len--) {char_array_3[i++] = *(bytes_to_encode++);if (i == 3) {char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);char_array_4[3] = char_array_3[2] & 0x3f;for(i = 0; (i <4) ; i++)ret += base64_chars[char_array_4[i]];i = 0;}}if (i) {for(j = i; j < 3; j++)char_array_3[j] = '\0';char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);char_array_4[3] = char_array_3[2] & 0x3f;for (j = 0; (j < i + 1); j++)ret += base64_chars[char_array_4[j]];while((i++ < 3))ret += '=';}return ret;}// Base64解码static string base64Decode(const string& encoded_string) {int in_len = encoded_string.size();int i = 0;int j = 0;int in = 0;unsigned char char_array_4[4], char_array_3[3];string ret;while (in_len-- && ( encoded_string[in] != '=') && is_base64(encoded_string[in])) {char_array_4[i++] = encoded_string[in]; in++;if (i ==4) {for (i = 0; i <4; i++)char_array_4[i] = base64_chars.find(char_array_4[i]);char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];for (i = 0; (i < 3); i++)ret += char_array_3[i];i = 0;}}if (i) {for (j = i; j <4; j++)char_array_4[j] = 0;for (j = 0; j <4; j++)char_array_4[j] = base64_chars.find(char_array_4[j]);char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];for (j = 0; (j < i - 1); j++) ret += char_array_3[j];}return ret;}// 读取文件内容static string readFile(const string& filename) {ifstream file(filename.c_str());if (!file.is_open()) {cout << "错误:无法打开文件 " << filename << endl;return "";}string content;string line;while (getline(file, line)) {content += line + "\n";}file.close();// 移除最后一个多余的换行符if (!content.empty() && content[content.length()-1] == '\n') {content.erase(content.length()-1);}return content;}// 写入文件static bool writeFile(const string& filename, const string& content) {ofstream file(filename.c_str());if (!file.is_open()) {cout << "错误:无法创建文件 " << filename << endl;return false;}file << content;file.close();return true;}
};// Base64字符表定义
const string FileEncryption::base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ""abcdefghijklmnopqrstuvwxyz""0123456789+/";// 显示菜单
void showMenu() {cout << "\n========== 文件加解密工具 ==========" << endl;cout << "1. 凯撒加密" << endl;cout << "2. 凯撒解密" << endl;cout << "3. 异或加密" << endl;cout << "4. 异或解密" << endl;cout << "5. Base64编码" << endl;cout << "6. Base64解码" << endl;cout << "7. 查看文件内容" << endl;cout << "0. 退出程序" << endl;cout << "===================================" << endl;cout << "请选择操作: ";
}int main() {int choice;string inputFile, outputFile, content, result;int shift;string key;cout << "欢迎使用简易文件加解密工具!" << endl;while (true) {showMenu();cin >> choice;switch (choice) {case 1: // 凯撒加密cout << "请输入要加密的文件名: ";cin >> inputFile;content = FileEncryption::readFile(inputFile);if (content.empty()) break;cout << "请输入位移值 (1-25): ";cin >> shift;shift = shift % 26;result = FileEncryption::caesarEncrypt(content, shift);cout << "请输入输出文件名: ";cin >> outputFile;if (FileEncryption::writeFile(outputFile, result)) {cout << "凯撒加密完成!已保存到 " << outputFile << endl;}break;case 2: // 凯撒解密cout << "请输入要解密的文件名: ";cin >> inputFile;content = FileEncryption::readFile(inputFile);if (content.empty()) break;cout << "请输入位移值 (1-25): ";cin >> shift;shift = shift % 26;result = FileEncryption::caesarDecrypt(content, shift);cout << "请输入输出文件名: ";cin >> outputFile;if (FileEncryption::writeFile(outputFile, result)) {cout << "凯撒解密完成!已保存到 " << outputFile << endl;}break;case 3: // 异或加密cout << "请输入要加密的文件名: ";cin >> inputFile;content = FileEncryption::readFile(inputFile);if (content.empty()) break;cout << "请输入密钥: ";cin >> key;result = FileEncryption::xorEncrypt(content, key);cout << "请输入输出文件名: ";cin >> outputFile;if (FileEncryption::writeFile(outputFile, result)) {cout << "异或加密完成!已保存到 " << outputFile << endl;cout << "注意:请记住密钥 \"" << key << "\",解密时需要使用相同密钥!" << endl;}break;case 4: // 异或解密cout << "请输入要解密的文件名: ";cin >> inputFile;content = FileEncryption::readFile(inputFile);if (content.empty()) break;cout << "请输入密钥: ";cin >> key;result = FileEncryption::xorEncrypt(content, key); // 异或解密与加密相同cout << "请输入输出文件名: ";cin >> outputFile;if (FileEncryption::writeFile(outputFile, result)) {cout << "异或解密完成!已保存到 " << outputFile << endl;}break;case 5: // Base64编码cout << "请输入要编码的文件名: ";cin >> inputFile;content = FileEncryption::readFile(inputFile);if (content.empty()) break;result = FileEncryption::base64Encode(content);cout << "请输入输出文件名: ";cin >> outputFile;if (FileEncryption::writeFile(outputFile, result)) {cout << "Base64编码完成!已保存到 " << outputFile << endl;}break;case 6: // Base64解码cout << "请输入要解码的文件名: ";cin >> inputFile;content = FileEncryption::readFile(inputFile);if (content.empty()) break;result = FileEncryption::base64Decode(content);cout << "请输入输出文件名: ";cin >> outputFile;if (FileEncryption::writeFile(outputFile, result)) {cout << "Base64解码完成!已保存到 " << outputFile << endl;}break;case 7: // 查看文件内容cout << "请输入要查看的文件名: ";cin >> inputFile;content = FileEncryption::readFile(inputFile);if (!content.empty()) {cout << "\n文件内容:" << endl;cout << "----------------------------------------" << endl;cout << content << endl;cout << "----------------------------------------" << endl;}break;case 0: // 退出cout << "感谢使用!再见!" << endl;return 0;default:cout << "无效选择,请重新输入!" << endl;break;}}return 0;
}

四、实战演练:从入门到精通的使用指南

1. 环境准备

  • 编译器:Dev C++ 5.11或其他支持C++98的编译器
  • 文件准备:创建一个测试文件test.txt,内容为:Hello World! This is a test file.

2. 实战举例

在这里插入图片描述

场景一:使用凯撒密码保护日记

1. 选择"1. 凯撒加密"
2. 输入文件名:diary.txt
3. 输入位移值:5
4. 输出文件:diary_encrypted.txt

先加密:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
将之前的diary.txt删掉,之后,我们进行解密:

在这里插入图片描述

在这里插入图片描述

场景二:使用异或加密保护密码文件

1. 选择"3. 异或加密"  
2. 输入文件名:passwords.txt
3. 输入密钥:MySecretKey2025
4. 输出文件:passwords_encrypted.txt

先加密:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
同样地,将之前的passwords.txt删掉,我们进行解密:

在这里插入图片描述

可以看到已解密成功

在这里插入图片描述

场景三:使用Base64编码传输文件

1. 选择"5. Base64编码"
2. 输入文件名:document.txt  
3. 输出文件:document_base64.txt

先加密:

在这里插入图片描述
在这里插入图片描述

同样地,将之前的document.txt删掉,我们再进行解密:

在这里插入图片描述
在这里插入图片描述

3. 常见问题解决

问题1:文件读取失败

  • 解决方案:确保文件在程序同目录下,文件名输入正确

问题2:中文乱码

  • 解决方案:保存文件时使用UTF-8编码,或在代码中添加locale设置

问题3:异或解密失败

  • 解决方案:确保使用与加密时完全相同的密钥,区分大小写

五、算法深度解析:揭秘加密背后的数学原理

1. 凯撒密码的数学本质

凯撒密码的加密解密算法,就是两个公式:加密公式 f(a)=(a+k) mod 26,解密公式 f(a)=(a+26-k) mod 26

// 加密:字符向前移动k位
char encrypt = ((original - 'A' + shift) % 26) + 'A';// 解密:字符向后移动k位  
char decrypt = ((encrypted - 'A' + 26 - shift) % 26) + 'A';

模运算的妙用

  • % 操作确保结果始终在0-25范围内
  • 实现了字母表的"循环"特性
  • Z的下一个字母是A,形成闭环

2. 异或运算的神奇特性

异或运算有几个重要性质:

  • 交换律A ⊕ B = B ⊕ A
  • 结合律(A ⊕ B) ⊕ C = A ⊕ (B ⊕ C)
  • 自逆性A ⊕ A = 0A ⊕ 0 = A
  • 可逆性:如果C = A ⊕ B,那么A = C ⊕ B

这就是为什么异或加密和解密用同一个函数的原因!

3. Base64的编码奥秘

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3×8 = 4×6 = 24)

编码过程

  1. 将3个字节(24位)分组
  2. 重新组织为4个6位的组
  3. 每个6位数对应Base64字符表中的一个字符
  4. 不足的部分用=填充

六、总结与展望:安全编程的下一步

1. 学习收获

通过这个项目,我们掌握了:

  • C++基础应用:文件操作、字符串处理、类的设计
  • 加密算法原理:三种经典算法的工作机制
  • 实际编程技巧:错误处理、用户交互、代码组织

2. 安全性说明

⚠️ 重要提醒

  • 这是一个教学工具,不建议用于重要数据的加密
  • 凯撒密码的安全性非常低,容易受到破解,只有26个可能的密钥,可以在短时间内被暴力破解
  • 异或加密的安全性取决于密钥的复杂度
  • Base64只是编码,不是真正的加密

3. 进阶方向

如果你想继续深入学习加密技术,可以考虑:

  • 现代加密算法:AES、RSA、ECC等
  • 密码学库:OpenSSL、Crypto++等
  • 密码学理论:数论、椭圆曲线、量子密码学
  • 安全工程:密钥管理、数字签名、安全协议

总结:通过构建这个简易的文件加解密工具,我们不仅学会了C++编程技巧,更重要的是理解了信息安全的基本概念。虽然这些算法在现代标准下并不够安全,但它们是通往高级密码学的重要stepping stone。记住,真正的安全不仅在于算法的复杂性,更在于正确的使用方式和完善的安全策略

创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

相关文章:

C++课设:实现简易文件加密工具(凯撒密码、异或加密、Base64编码)

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《编程项目实战》 目录 一、初识文件加密&#xff1a;为什么需要…...

H_Prj06_03 8088单板机串口读取8088ROM复位内存

1.8088CPU复位时&#xff0c;CSFFFFH,IP0000H,因此在ROM的逻辑地址FFFF&#xff1a;0000&#xff08;FFF0H&#xff09;处一般要防止一个长跳转指令LJMP&#xff08;机器码位EAH&#xff09; 2.写一个完整的8086汇编程序&#xff0c;通过查询方式检测串口接收符串‘r’&#x…...

构建 MCP 服务器:第 3 部分 — 添加提示

这是我们构建 MCP 服务器的四部分教程的第三部分。在第一部分中&#xff0c;我们使用基本资源创建了第一个MCP 服务器&#xff1b;在第二部分中&#xff0c;我们添加了资源模板并改进了代码组织。现在&#xff0c;我们将进一步重构代码并添加提示功能。 什么是 MCP 提示&#…...

xcode 各版本真机调试包下载

下载地址 https://github.com/filsv/iOSDeviceSupport 使用方法&#xff1a; 添加到下面路径中&#xff0c;然后退出重启xcode /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport...

基于React + FastAPI + LangChain + 通义千问的智能医疗问答系统

&#x1f4cc; 文章摘要&#xff1a; 本文详细介绍了如何在前端通过 Fetch 实现与 FastAPI 后端的 流式响应通信&#xff0c;并支持图文多模态数据上传。通过构建 multipart/form-data 请求&#xff0c;配合 ReadableStream 实时读取 AI 回复内容&#xff0c;实现类似 ChatGPT…...

C# 中替换多层级数据的 Id 和 ParentId,保持主从或父子关系不变

在C#中替换多层级数据的Id和ParentId&#xff0c;同时保持父子关系不变&#xff0c;可以通过以下步骤实现&#xff1a; 创建旧Id到新Id的映射&#xff1a;遍历所有节点&#xff0c;为每个旧Id生成唯一的新Id&#xff0c;并存储在字典中。 替换节点的Id和ParentId&#xff1a;…...

Scade 语言概念 - 方程(equation)

在 Scade 6 程序中自定义算子(Operator)的定义、或数据流定义(data_def)的内容中&#xff0c;包含一种基本的语言结构&#xff1a;方程(equation)(注1)。在本篇中&#xff0c;将叙述 Scade 语言方程的文法形式&#xff0c;以及作用。 注1: 对 Scade 中的 equation, 或 equation…...

PG 分区表的缺陷

简介 好久没发文&#xff0c;是最近我实在不知道写点啥。随着国产化进程&#xff0c;很多 oracle 都在进行迁移&#xff0c;最近遇到了一个分区表迁移之后唯一性的问题。oracle 数据库中创建主键或者唯一索引&#xff0c;不需要引用分区键&#xff0c;但是 PG 就不行&#xff…...

从Copilot到Agent,AI Coding是如何进化的?

编程原本是一项具有一定门槛的技能&#xff0c;但借助 AI Coding 产品&#xff0c;新手也能写出可运行的代码&#xff0c;非专业人员如业务分析师、产品经理&#xff0c;也能在 AI 帮助下直接生成简单应用。 这一演变对软件产业产生了深远影响。当 AI 逐步参与代码生成、调试乃…...

Qt(part 2)1、Qwindow(菜单栏,工具栏,状态栏),铆接部件,核心部件 ,2、添加资源文件 3、对话框

1、Qwindow tips&#xff1a;1&#xff0c;首先为什么创建出的对象基本都是指针形式&#xff0c;个人觉得是对象树的原因&#xff08;自动释放内存&#xff09;&#xff0c;指针来访问成员函数->的形式。2&#xff0c;菜单栏只能一个的&#xff0c;放窗口基本Set&#xff0c…...

【图片识别Excel】批量提取图片中的文字,图片设置识别区域,识别后将文字提取并保存Excel表格,基于WPF和OCR识别的应用

应用场景 在办公自动化、文档处理、数据录入等场景中&#xff0c;经常需要从大量图片中提取文字信息。例如&#xff1a; 批量处理扫描的表单、合同、发票等文档从图片集中提取特定区域的文字数据将纸质资料快速转换为电子文本并整理归档 通过设置识别区域&#xff0c;可以精…...

深入理解 Java 多线程:原理剖析与实战指南

深入理解 Java 多线程&#xff1a;原理剖析与实战指南 一、引言 在现代软件开发中&#xff0c;多线程编程已经成为提升应用性能与响应能力的重要手段。Java 作为一门成熟的编程语言&#xff0c;自 JDK 1.0 起就提供了对多线程的原生支持。本文将深入剖析 Java 多线程的底层原…...

Qt/C++学习系列之Excel使用记录

Qt/C学习系列之Excel使用记录 前言The process was ended forcefully.解决方式断点查语句问题 总结 前言 在项目中解析条目达50多条&#xff0c;并且都需要将对应的结果进行显示。为了将结果显示的更加清晰&#xff0c;考虑采用QTableWidget进行表格设置&#xff0c;而在使用过…...

跳转指令四维全解:从【call/jmp 】的时空法则到内存迷宫导航术

一、核心概念&#xff1a;代码世界的空间定位法则 在汇编世界里&#xff0c;我们可以把内存想象成一栋巨大的图书馆&#xff1a; CS&#xff08;代码段寄存器&#xff09; 楼层编号 IP&#xff08;指令指针&#xff09; 房间编号 当前执行位置 CS:IP&#xff08;如3楼201…...

LabVIEW实时系统数据监控与本地存储

基于LabVIEW Real-Time 模块&#xff0c;面向工业自动化、嵌入式测控等场景&#xff0c;提供实时数据采集、监控与本地存储的完整实现路径。通过分层任务调度、TDMS 文件格式应用及跨平台兼容性设计&#xff0c;确保系统在实时性、可靠性与数据管理效率间达到平衡。文中以 Comp…...

从 Revit 到 3DTiles:GISBox RVT 切片器如何让建筑图元在 Web 端展示

在GIS&#xff08;地理信息系统&#xff09;行业蓬勃发展的当下&#xff0c;数据处理与展示的效率和精准度成为关键。GISBox作为一款功能强大的一站式三维GIS数据编辑、转换、发布平台&#xff0c;凭借其独特的“RVT切片器”功能&#xff0c;在RVT图元处理方面也有着不俗的表现…...

Appium+python自动化(十二)- Android UIAutomator

Android团队在4.1版本&#xff08;API 16&#xff09;中推出了一款全新的UI自动化测试工具UiAutomator&#xff0c;用来帮助开发人员更有效率的完成App的Debug工作&#xff0c;同时对于测试人员也是一大福音&#xff0c;为什么这么说呢&#xff1f; UiAutomator提供了以下两种…...

在C语言中使用UUID作为AES加密密钥

在C语言中使用UUID作为AES加密密钥 编译依赖安装示例代码编译和运行关键点说明![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0df1f1d803cd40688f6d58a9d0e1f1d9.png)注意事项编译依赖安装 运行环境位centos8 Linux 4.18.0-348.7.1.el8_5.x86_64 #1 SMP Wed Dec …...

Nginx+Tomcat负载均衡集群

目录 一、Tomcat 基础与单节点部署 &#xff08;一&#xff09;Tomcat 概述 &#xff08;二&#xff09;单节点部署案例 1. 案例环境 2. 实施准备 3. 安装 JDK 4. 查看 JDK 安装情况 5. 安装配置 Tomcat 6. 启动 Tomcat 7. 访问测试 8. 关闭 Tomcat &#xff08;三…...

QQ邮箱发送验证码(Springboot)

一、邮箱发送服务准备 在qq邮箱的设置中选择账号下开启服务。 开启时可能会有短信验证&#xff0c;开启后显示验证码之类的一串英文&#xff0c;复制保存起来&#xff0c;在配置文件中会使用到。 二、后端依赖及配置 依赖 在pom.yml文件中添加相关依赖&#xff0c;redis的…...

Python Copilot【代码辅助工具】 简介

粉丝爱买鳕鱼肠深海鳕鱼肉鱼肉香肠盼盼麦香鸡味块卡乐比&#xff08;Calbee&#xff09;薯条三兄弟 独立小包美丽雅 奶茶杯一次性饮料杯好时kisses多口味巧克力糖老金磨方【黑金系列】黑芝麻丸郑新初网红郑新初烤鲜牛肉干超人毛球修剪器去球器剃毛器衣服去毛器优惠券宁之春 红黑…...

如何写高效的Prompt?

概述 提示词(Prompt)的质量将直接影响模型生成结果的质量&#xff0c;所以精心设计一个让大模型能够理解并有效回复的提示词是至关重要的。本文内容自论文中获取&#xff1a;https://arxiv.org/pdf/2312.16171 介绍了5类共计26条提示词书写原则。 书写原则 类别原则备注快速…...

【EF Core】 EF Core并发控制:乐观锁与悲观锁的应用

文章目录 前言一、并发的风险二、EF Core中的并发控制方式2.1 开放式并发&#xff08;乐观锁&#xff09;2.1.1 应用程序管理的属性并发令牌2.1.2 数据库生成的并发令牌 2.2 悲观锁 总结 前言 实际的生产环境中&#xff0c;我们经常能遇到数据库由多个应用程序同时使用。每个程…...

WaytoAGI东京大会开启AI全球化新对话:技术无国界,合作促创新

全球AI专家齐聚东京&#xff0c;一场关于技术无国界的对话正在进行。 2025年6月7日&#xff0c;一场备受瞩目的AI盛会——“WaytoAGI全球AI大会东京站”在日本东京樱美林大学新宿校区正式拉开帷幕。这场为期两天的会议&#xff08;6月7日至8日&#xff09;由国内最大的AI开源知…...

Harmony核心:动态方法修补与.NET游戏Mod开发

一、Harmony的核心定位与设计哲学 Harmony是一个运行时动态方法修补库&#xff0c;专为修改已编译的.NET/Mono应用程序而设计&#xff0c;尤其适用于游戏Mod开发。其核心创新在于&#xff1a; 非破坏性修改&#xff1a;保留原始方法完整性&#xff0c;避免直接替换或覆盖。多…...

AI系统应用开发工程师

以下是对AI系统应用开发与运维岗位的梳理整合&#xff0c;从企业、岗位、任务、能力等维度进行分类呈现&#xff0c;便于清晰对比两者的工作侧重&#xff1a; 一、代表性企业对比 分类企业名称应用开发方向中移系统集成有限公司、科大讯飞河北科技有限公司、华为技术服务有限…...

Qt Test功能及架构

Qt Test 是 Qt 框架中的单元测试模块&#xff0c;在 Qt 6.0 中提供了全面的测试功能。 一、主要功能 核心功能 1. 单元测试框架 提供完整的单元测试基础设施 支持测试用例、测试套件的组织和执行 包含断言宏和测试结果收集 2. 测试类型支持 单元测试&#xff1a;对单个函…...

图像处理、图像分析和图像理解的定义、联系与区别

1. 定义 图像处理&#xff08;Image Processing&#xff09; 图像处理是低层操作&#xff0c;主要针对像素级的图像数据进行加工&#xff0c;目的是改善图像质量或为后续分析做准备。 典型任务&#xff1a;去噪、增强&#xff08;如对比度调整&#xff09;、锐化、边缘检测、图…...

【Java开发日记】说一说 SpringBoot 中 CommandLineRunner

目录 1、CommandLineRunner SpringBoot中CommandLineRunner的作用 简单例子 多个类实现CommandLineRunner接口执行顺序的保证 通过实现Ordered接口实现控制执行顺序 通过Order注解实现控制执行顺序 Order 作用 2、ApplicationRunner 3、传递参数 4、源码跟踪 run()方…...

全面理解 Linux 内核性能问题:分类、实战与调优策略

在 Linux 系统&#xff08;特别是嵌入式或服务器环境&#xff09;中&#xff0c;性能问题往往错综复杂、表象多变。只有对常见性能问题进行系统归类、理解其症状与根源&#xff0c;才能有效定位和解决。本文将围绕八大类核心性能问题&#xff0c;结合实战示例&#xff0c;逐类分…...