C# Windows Forms应用程序-003

目录

项目结构

命名空间和类定义

主要控件

GroupBox 控件

Label 控件

TextBox 控件

Button 控件

OpenFileDialog 控件

方法说明

构造函数 Form1()

Dispose(bool disposing)

Main()

InitializeComponent()

button1_Click(object sender, System.EventArgs e)

button2_Click(object sender, System.EventArgs e)

button4_Click(object sender, System.EventArgs e)

button3_Click(object sender, System.EventArgs e)

加密和解密方法

异常处理

项目截图:

项目源码:


项目结构

  • 命名空间和类定义

    • using指令导入所需的命名空间。
    • AesFile命名空间包含整个应用程序。
    • Form1类继承自System.Windows.Forms.Form,是主窗体类。

主要控件

  • GroupBox 控件

    • groupBox1: 包含加密文件相关的控件。
    • groupBox2: 包含解密文件相关的控件。
  • Label 控件

    • 提示用户输入相关信息,例如“被加密文件名”、“设定密码”。
  • TextBox 控件

    • textBox1: 显示被加密文件路径,只读。
    • textBox2: 输入加密后输出文件路径。
    • textBox3 & textBox4: 输入和确认加密密码。
    • textBox6: 输入解密密码。
    • textBox7: 输入解密后输出文件路径。
    • textBox8: 显示已加密文件路径,只读。
  • Button 控件

    • button1: 浏览并选择被加密文件。
    • button2: 执行加密操作。
    • button3: 执行解密操作。
    • button4: 浏览并选择已加密文件。
  • OpenFileDialog 控件

    • openFileDialog1: 允许用户选择文件。

方法说明

构造函数 Form1()

  • public Form1()构造函数调用InitializeComponent()方法初始化控件。

Dispose(bool disposing)

  • 清理所有正在使用的资源。
  • 如果 disposing 为 true,则释放托管资源。
  • protected override void Dispose(bool disposing)方法负责释放非托管资源

Main()

  • 应用程序的入口点。
  • 启动 Form1 窗口。

InitializeComponent()

  • 自动生成的方法,包含界面元素的设计信息。
  • 不应手动修改此方法的内容。

button1_Click(object sender, System.EventArgs e)

  • 处理“浏览文件”按钮点击事件。
  • 弹出文件对话框让用户选择要加密的文件,并将文件路径显示在 textBox1 中。

button2_Click(object sender, System.EventArgs e)

  • 处理“加密文件”按钮点击事件。
  • 检查用户是否选择了要加密的文件、提供了输出文件名及有效的密码。
  • 根据提供的密码生成 AES密钥。
  • 创建文件流进行加密操作。
  • 使用 EncryptFile进行实际的加密过程。
  • 加密完成后关闭所有流并弹出成功提示。

button4_Click(object sender, System.EventArgs e)

  • 处理“浏览文件”按钮点击事件。
  • 弹出文件对话框让用户选择要解密的文件,并将文件路径显示在 textBox8 中。

button3_Click(object sender, System.EventArgs e)

  • 处理“解密文件”按钮点击事件。
  • 检查用户是否选择了要解密的文件、提供了输出文件名及有效的密码。
  • 根据提供的密码生成 AES密钥。
  • 创建文件流进行解密操作。
  • 使用 DecryptFile进行实际的解密过程。
  • 解密完成后关闭所有流并弹出成功提示。
  • 如果发生异常,则捕获错误并显示错误消息。

加密和解密方法

  • EncryptFile方法使用Rijndael算法对文件进行加密,生成一个盐值并与加密数据一起写入输出文件。
  • DecryptFile方法使用相同的密码和盐值对文件进行解密,将解密后的数据写入输出文件。
  • GenerateSalt方法生成一个随机盐值,增强安全性。

异常处理

  • 在加密和解密过程中捕获异常并提示用户。

项目截图:

项目源码:

using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
using System.IO;
using System.Security.Cryptography;namespace AesFile
{/// <summary>/// Form1 的摘要说明。/// </summary>public class Form1 : System.Windows.Forms.Form{// 定义各种控件变量private GroupBox groupBox1; // 用于加密文件设置的组框private Label label1; // 显示“被加密文件名”的标签private TextBox textBox1; // 显示被加密文件名的文本框private TextBox textBox2; // 输入加密输出文件名的文本框private Label label2; // 显示“加密输出文件名”的标签private TextBox textBox3; // 输入设定密码的文本框private Label label3; // 显示“设定密码(大于6位)”的标签private TextBox textBox4; // 重复输入设定密码的文本框private Label label4; // 显示“重复设定的密码”的标签private Button button1; // 浏览文件按钮private Button button2; // 加密文件按钮private GroupBox groupBox2; // 用于解密文件设置的组框private Button button3; // 解密文件按钮private Button button4; // 浏览文件按钮private TextBox textBox6; // 输入解密密码的文本框private Label label6; // 显示“输入密码”的标签private TextBox textBox7; // 输入解密输出文件名的文本框private Label label7; // 显示“解密输出文件名”的标签private TextBox textBox8; // 显示被解密文件名的文本框private Label label8; // 显示“被解密文件名”的标签private OpenFileDialog openFileDialog1; // 打开文件对话框private Container components = null; // 管理窗体组件的对象public Form1(){InitializeComponent(); // 初始化窗体组件}protected override void Dispose(bool disposing){if (disposing && (components != null)) // 如果正在释放资源并且组件不为空{components.Dispose(); // 释放所有托管资源}base.Dispose(disposing); // 调用基类的Dispose方法}#region Windows 窗体设计器生成的代码private void InitializeComponent(){this.groupBox1 = new GroupBox(); // 实例化groupBox1this.button2 = new Button(); // 实例化button2this.button1 = new Button(); // 实例化button1this.textBox4 = new TextBox(); // 实例化textBox4this.label4 = new Label(); // 实例化label4this.textBox3 = new TextBox(); // 实例化textBox3this.label3 = new Label(); // 实例化label3this.textBox2 = new TextBox(); // 实例化textBox2this.label2 = new Label(); // 实例化label2this.textBox1 = new TextBox(); // 实例化textBox1this.label1 = new Label(); // 实例化label1this.groupBox2 = new GroupBox(); // 实例化groupBox2this.button3 = new Button(); // 实例化button3this.button4 = new Button(); // 实例化button4this.textBox6 = new TextBox(); // 实例化textBox6this.label6 = new Label(); // 实例化label6this.textBox7 = new TextBox(); // 实例化textBox7this.label7 = new Label(); // 实例化label7this.textBox8 = new TextBox(); // 实例化textBox8this.label8 = new Label(); // 实例化label8this.openFileDialog1 = new OpenFileDialog(); // 实例化openFileDialog1this.groupBox1.SuspendLayout(); // 暂停groupBox1布局逻辑this.groupBox2.SuspendLayout(); // 暂停groupBox2布局逻辑this.SuspendLayout(); // 暂停Form1布局逻辑// // groupBox1// this.groupBox1.Controls.Add(this.button2); // 将button2添加到groupBox1中this.groupBox1.Controls.Add(this.button1); // 将button1添加到groupBox1中this.groupBox1.Controls.Add(this.textBox4); // 将textBox4添加到groupBox1中this.groupBox1.Controls.Add(this.label4); // 将label4添加到groupBox1中this.groupBox1.Controls.Add(this.textBox3); // 将textBox3添加到groupBox1中this.groupBox1.Controls.Add(this.label3); // 将label3添加到groupBox1中this.groupBox1.Controls.Add(this.textBox2); // 将textBox2添加到groupBox1中this.groupBox1.Controls.Add(this.label2); // 将label2添加到groupBox1中this.groupBox1.Controls.Add(this.textBox1); // 将textBox1添加到groupBox1中this.groupBox1.Controls.Add(this.label1); // 将label1添加到groupBox1中this.groupBox1.Location = new Point(38, 24); // 设置groupBox1的位置this.groupBox1.Name = "groupBox1"; // 设置groupBox1的名称this.groupBox1.Size = new Size(509, 209); // 设置groupBox1的大小this.groupBox1.TabIndex = 0; // 设置groupBox1的Tab索引this.groupBox1.TabStop = false; // 设置groupBox1是否显示边框this.groupBox1.Text = "加密文件设置"; // 设置groupBox1的标题文本// // button2// this.button2.Location = new Point(349, 160); // 设置button2的位置this.button2.Name = "button2"; // 设置button2的名称this.button2.Size = new Size(80, 23); // 设置button2的大小this.button2.TabIndex = 9; // 设置button2的Tab索引this.button2.Text = "加密文件"; // 设置button2的文本this.button2.Click += new EventHandler(this.button2_Click); // 绑定button2的点击事件处理程序// // button1// this.button1.Location = new Point(349, 121); // 设置button1的位置this.button1.Name = "button1"; // 设置button1的名称this.button1.Size = new Size(80, 23); // 设置button1的大小this.button1.TabIndex = 8; // 设置button1的Tab索引this.button1.Text = "浏览文件"; // 设置button1的文本this.button1.Click += new EventHandler(this.button1_Click); // 绑定button1的点击事件处理程序// // textBox4// this.textBox4.Location = new Point(120, 162); // 设置textBox4的位置this.textBox4.Name = "textBox4"; // 设置textBox4的名称this.textBox4.PasswordChar = '*'; // 设置textBox4的密码字符this.textBox4.Size = new Size(223, 21); // 设置textBox4的大小this.textBox4.TabIndex = 7; // 设置textBox4的Tab索引// // label4// this.label4.Location = new Point(8, 170); // 设置label4的位置this.label4.Name = "label4"; // 设置label4的名称this.label4.Size = new Size(104, 16); // 设置label4的大小this.label4.TabIndex = 6; // 设置label4的Tab索引this.label4.Text = "重复设定的密码:"; // 设置label4的文本// // textBox3// this.textBox3.Location = new Point(120, 123); // 设置textBox3的位置this.textBox3.Name = "textBox3"; // 设置textBox3的名称this.textBox3.PasswordChar = '*'; // 设置textBox3的密码字符this.textBox3.Size = new Size(223, 21); // 设置textBox3的大小this.textBox3.TabIndex = 5; // 设置textBox3的Tab索引// // label3// this.label3.Location = new Point(8, 131); // 设置label3的位置this.label3.Name = "label3"; // 设置label3的名称this.label3.Size = new Size(128, 16); // 设置label3的大小this.label3.TabIndex = 4; // 设置label3的Tab索引this.label3.Text = "设定密码(大于6位):"; // 设置label3的文本// // textBox2// this.textBox2.Location = new Point(120, 80); // 设置textBox2的位置this.textBox2.Name = "textBox2"; // 设置textBox2的名称this.textBox2.Size = new Size(223, 21); // 设置textBox2的大小this.textBox2.TabIndex = 3; // 设置textBox2的Tab索引// // label2// this.label2.Location = new Point(8, 85); // 设置label2的位置this.label2.Name = "label2"; // 设置label2的名称this.label2.Size = new Size(104, 16); // 设置label2的大小this.label2.TabIndex = 2; // 设置label2的Tab索引this.label2.Text = "加密输出文件名:"; // 设置label2的文本// // textBox1// this.textBox1.BackColor = SystemColors.Control; // 设置textBox1的背景颜色this.textBox1.Location = new Point(120, 34); // 设置textBox1的位置this.textBox1.Name = "textBox1"; // 设置textBox1的名称this.textBox1.ReadOnly = true; // 设置textBox1为只读模式this.textBox1.Size = new Size(223, 21); // 设置textBox1的大小this.textBox1.TabIndex = 1; // 设置textBox1的Tab索引// // label1// this.label1.Location = new Point(8, 37); // 设置label1的位置this.label1.Name = "label1"; // 设置label1的名称this.label1.Size = new Size(96, 16); // 设置label1的大小this.label1.TabIndex = 0; // 设置label1的Tab索引this.label1.Text = "被加密文件名:"; // 设置label1的文本// // groupBox2// this.groupBox2.Controls.Add(this.button3); // 将button3添加到groupBox2中this.groupBox2.Controls.Add(this.button4); // 将button4添加到groupBox2中this.groupBox2.Controls.Add(this.textBox6); // 将textBox6添加到groupBox2中this.groupBox2.Controls.Add(this.label6); // 将label6添加到groupBox2中this.groupBox2.Controls.Add(this.textBox7); // 将textBox7添加到groupBox2中this.groupBox2.Controls.Add(this.label7); // 将label7添加到groupBox2中this.groupBox2.Controls.Add(this.textBox8); // 将textBox8添加到groupBox2中this.groupBox2.Controls.Add(this.label8); // 将label8添加到groupBox2中this.groupBox2.Location = new Point(38, 272); // 设置groupBox2的位置this.groupBox2.Name = "groupBox2"; // 设置groupBox2的名称this.groupBox2.Size = new Size(509, 198); // 设置groupBox2的大小this.groupBox2.TabIndex = 1; // 设置groupBox2的Tab索引this.groupBox2.TabStop = false; // 设置groupBox2是否显示边框this.groupBox2.Text = "解密文件设置"; // 设置groupBox2的标题文本// // button3// this.button3.Location = new Point(322, 136); // 设置button3的位置this.button3.Name = "button3"; // 设置button3的名称this.button3.Size = new Size(80, 23); // 设置button3的大小this.button3.TabIndex = 9; // 设置button3的Tab索引this.button3.Text = "解密文件"; // 设置button3的文本this.button3.Click += new EventHandler(this.button3_Click); // 绑定button3的点击事件处理程序// // button4// this.button4.Location = new Point(223, 136); // 设置button4的位置this.button4.Name = "button4"; // 设置button4的名称this.button4.Size = new Size(80, 23); // 设置button4的大小this.button4.TabIndex = 8; // 设置button4的Tab索引this.button4.Text = "浏览文件"; // 设置button4的文本this.button4.Click += new EventHandler(this.button4_Click); // 绑定button4的点击事件处理程序// // textBox6// this.textBox6.Location = new Point(97, 136); // 设置textBox6的位置this.textBox6.Name = "textBox6"; // 设置textBox6的名称this.textBox6.PasswordChar = '*'; // 设置textBox6的密码字符this.textBox6.Size = new Size(120, 21); // 设置textBox6的大小this.textBox6.TabIndex = 5; // 设置textBox6的Tab索引// // label6// this.label6.Location = new Point(19, 139); // 设置label6的位置this.label6.Name = "label6"; // 设置label6的名称this.label6.Size = new Size(72, 16); // 设置label6的大小this.label6.TabIndex = 4; // 设置label6的Tab索引this.label6.Text = "输入密码:"; // 设置label6的文本// // textBox7// this.textBox7.Location = new Point(120, 93); // 设置textBox7的位置this.textBox7.Name = "textBox7"; // 设置textBox7的名称this.textBox7.Size = new Size(282, 21); // 设置textBox7的大小this.textBox7.TabIndex = 3; // 设置textBox7的Tab索引// // label7// this.label7.Location = new Point(19, 96); // 设置label7的位置this.label7.Name = "label7"; // 设置label7的名称this.label7.Size = new Size(104, 16); // 设置label7的大小this.label7.TabIndex = 2; // 设置label7的Tab索引this.label7.Text = "解密输出文件名:"; // 设置label7的文本// // textBox8// this.textBox8.BackColor = SystemColors.Control; // 设置textBox8的背景颜色this.textBox8.Location = new Point(120, 50); // 设置textBox8的位置this.textBox8.Name = "textBox8"; // 设置textBox8的名称this.textBox8.ReadOnly = true; // 设置textBox8为只读模式this.textBox8.Size = new Size(282, 21); // 设置textBox8的大小this.textBox8.TabIndex = 1; // 设置textBox8的Tab索引// // label8// this.label8.Location = new Point(19, 53); // 设置label8的位置this.label8.Name = "label8"; // 设置label8的名称this.label8.Size = new Size(96, 16); // 设置label8的大小this.label8.TabIndex = 0; // 设置label8的Tab索引this.label8.Text = "被解密文件名:"; // 设置label8的文本// // openFileDialog1// this.openFileDialog1.FileName = "openFileDialog1"; // 设置openFileDialog1的默认文件名// // Form1// this.AutoScaleBaseSize = new Size(6, 14); // 设置窗体自动缩放的基本大小this.ClientSize = new Size(587, 500); // 设置窗体的客户区大小this.Controls.Add(this.groupBox2); // 将groupBox2添加到窗体中this.Controls.Add(this.groupBox1); // 将groupBox1添加到窗体中this.Name = "Form1"; // 设置窗体的名称this.StartPosition = FormStartPosition.CenterScreen; // 设置窗体启动位置为中心屏幕this.Text = "文件加密解密工具"; // 设置窗体的标题文本this.groupBox1.ResumeLayout(false); // 恢复groupBox1布局逻辑this.groupBox1.PerformLayout(); // 执行groupBox1的布局逻辑this.groupBox2.ResumeLayout(false); // 恢复groupBox2布局逻辑this.groupBox2.PerformLayout(); // 执行groupBox2的布局逻辑this.ResumeLayout(false); // 恢复Form1布局逻辑}#endregion// 处理“浏览文件”按钮点击事件(加密)private void button1_Click(object sender, EventArgs e){if (openFileDialog1.ShowDialog() == DialogResult.OK) // 显示打开文件对话框并检查结果{textBox1.Text = openFileDialog1.FileName; // 设置textBox1的文本为选定的文件路径}}// 处理“加密文件”按钮点击事件private void button2_Click(object sender, EventArgs e){string inputFile = textBox1.Text; // 获取被加密文件的路径string outputFile = textBox2.Text; // 获取加密后文件的路径string password = textBox3.Text; // 获取设定的密码string confirmPassword = textBox4.Text; // 获取确认的密码if (string.IsNullOrEmpty(inputFile) || string.IsNullOrEmpty(outputFile) || string.IsNullOrEmpty(password)){MessageBox.Show("请输入所有必要的信息。"); // 提示用户输入所有必要信息return;}if (password.Length < 6){MessageBox.Show("密码必须至少6位。"); // 提示密码长度不足return;}if (password != confirmPassword){MessageBox.Show("两次输入的密码不一致。"); // 提示密码不一致return;}try{EncryptFile(inputFile, outputFile, password); // 调用加密文件的方法MessageBox.Show("文件已成功加密。"); // 提示文件加密成功}catch (Exception ex){MessageBox.Show( $ "加密失败: {ex.Message}"); // 提示加密失败并显示错误信息            }        }        // 处理“浏览文件”按钮点击事件(解密)        private void button4_Click(object sender, EventArgs e)        {            if (openFileDialog1.ShowDialog() == DialogResult.OK) // 显示打开文件对话框并检查结果            {                textBox8.Text = openFileDialog1.FileName; // 设置textBox8的文本为选定的文件路径            }        }        // 处理“解密文件”按钮点击事件        private void button3_Click(object sender, EventArgs e)        {            string inputFile = textBox8.Text; // 获取被解密文件的路径            string outputFile = textBox7.Text; // 获取解密后文件的路径            string password = textBox6.Text; // 获取输入的密码            if (string.IsNullOrEmpty(inputFile) || string.IsNullOrEmpty(outputFile) || string.IsNullOrEmpty(password))            {                MessageBox.Show("请输入所有必要的信息。"); // 提示用户输入所有必要信息                return;            }            try            {                DecryptFile(inputFile, outputFile, password); // 调用解密文件的方法                MessageBox.Show("文件已成功解密。"); // 提示文件解密成功            }            catch (Exception ex)            {                MessageBox.Show( $ "解密失败: {ex.Message}"); // 提示解密失败并显示错误信息}}// 文件加密方法private void EncryptFile(string inputFile, string outputFile, string password){using (FileStream inputStream = File.OpenRead(inputFile), outputStream = File.Create(outputFile)){byte[] salt = GenerateSalt(); // 生成盐值RijndaelManaged rijndael = new RijndaelManaged();rijndael.KeySize = 256;rijndael.BlockSize = 128;PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, salt);rijndael.Key = pdb.GetBytes(rijndael.KeySize / 8);rijndael.IV = pdb.GetBytes(rijndael.BlockSize / 8);outputStream.Write(salt, 0, salt.Length); // 写入盐值到输出流CryptoStream cryptoStream = new CryptoStream(outputStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write);inputStream.CopyTo(cryptoStream); // 将输入流复制到加密流cryptoStream.FlushFinalBlock(); // 刷新加密流}}// 文件解密方法private void DecryptFile(string inputFile, string outputFile, string password){using (FileStream inputStream = File.OpenRead(inputFile), outputStream = File.Create(outputFile)){byte[] salt = new byte[16]; // 创建一个数组来存储盐值inputStream.Read(salt, 0, salt.Length); // 从输入流中读取盐值RijndaelManaged rijndael = new RijndaelManaged();rijndael.KeySize = 256;rijndael.BlockSize = 128;PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, salt);rijndael.Key = pdb.GetBytes(rijndael.KeySize / 8);rijndael.IV = pdb.GetBytes(rijndael.BlockSize / 8);CryptoStream cryptoStream = new CryptoStream(inputStream, rijndael.CreateDecryptor(), CryptoStreamMode.Read);cryptoStream.CopyTo(outputStream); // 将解密流复制到输出流}}// 生成盐值的方法private byte[] GenerateSalt(){RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();byte[] salt = new byte[16];rngCsp.GetBytes(salt); // 使用随机数生成器填充盐值return salt;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C/C++】死锁的四大条件与预防策略详解

文章目录 死锁的四大条件与预防策略详解一、死锁的产生条件&#xff08;四个必要条件&#xff09;二、代码示例三、死锁的预防手段&#xff08;以 C/C 为例&#xff09;1. 破坏“循环等待” —— 统一加锁顺序&#xff08;推荐&#xff09;2. 使用 std::lock 一次性加多个锁3. …

Rust编程环境安装

文章目录 Rust编程环境安装一、安装准备二、安装步骤对于Linux/macOS用户对于Windows用户 三、验证安装四、环境配置检查五、工具链管理六、附加功能七、常见问题处理八、编辑器支持九、其他 Rust编程环境安装 一、安装准备 1. 支持系统&#xff1a;Windows/Linux/macOS 2. 所…

OpenHarmony平台驱动使用(五),HDMI

OpenHarmony平台驱动使用&#xff08;五&#xff09; HDMI 概述 功能简介 HDMI&#xff08;High Definition Multimedia Interface&#xff09;&#xff0c;即高清多媒体接口&#xff0c;主要用于DVD、机顶盒等音视频Source到TV、显示器等Sink设备的传输。 HDMI以主从方式工…

【Git】Commit Hash vs Change-Id

文章目录 1、Commit 号2、Change-Id 号3、区别与联系4、实际场景示例5、为什么需要两者&#xff1f;6、总结附录——Gerrit 在 Git 和代码审查工具&#xff08;如 Gerrit&#xff09;中&#xff0c;Commit 号&#xff08;Commit Hash&#xff09; 和 Change-Id 号 是两个不同的…

leetcode hot100刷题日记——21.不同路径

和20题一样的思路link 题解&#xff1a; class Solution { public:int dfs(int i,int j,vector<vector<int>>&memo){//超过了边界&#xff0c;return 0if(i<0||j<0){return 0;}//从&#xff08;0&#xff0c;0&#xff09;到&#xff08;0&#xff0c;0…

day2 MySQL表数据操作

一&#xff1a;数据操作 注&#xff1a;在编写MySQL代码时可以不用区分大小写 1.查看表结构 desc 表名; -- 查看表中的字段类型&#xff0c;长度&#xff0c;约束。 2.字段的增加 AFTER table 表名 add 字段名 数据类型; -- 默认末尾添加 after table 表名 add 字段名 …

GitAny - 無需登入的 GitHub 最新倉庫檢索工具

地址&#xff1a;https://github.com/MartinxMax/gitany GitAny - 無需登入的 GitHub 專案搜尋工具 GitAny 是一款基於 Python 的工具&#xff0c;允許你在無需登入的情況下搜尋當天最新的 GitHub 專案。它支援模糊搜尋、條件篩選以及倉庫資料的視覺化分析。 安裝依賴 $ pip…

格恩朗金属管浮子流量计 高精度测量的不二之选​

在流量测量的复杂领域&#xff0c;精度就是生命线&#xff0c;直接关乎生产的稳定性、产品的质量以及资源的合理利用。大连格恩朗品牌的金属管浮子流量计&#xff0c;凭借其卓越的精度表现&#xff0c;成为各行业在流量测量时的最佳之选。​ 格恩朗金属管浮子流量计运用经典的可…

【R语言编程绘图-箱线图】

基本箱线图绘制 使用ggplot2绘制箱线图的核心函数是geom_boxplot()。以下是一个基础示例&#xff0c;展示如何用iris数据集绘制不同物种&#xff08;Species&#xff09;的萼片长度&#xff08;Sepal.Length&#xff09;分布&#xff1a; library(ggplot2) ggplot(iris, aes(…

深度学习能取代机器学习吗?

在人工智能领域&#xff0c;“机器学习”和“深度学习”这两个词经常被混为一谈。很多新手甚至以为只要跟 AI 有关的任务&#xff0c;都该用深度学习。但其实&#xff0c;它们并不是谁强谁弱的关系&#xff0c;而是适合不同场景的工具。 这篇文章就来帮你理清楚&#xff1a; 机…

UPS的工作原理和UPS系统中旁路的作用

UPS&#xff08;不间断电源&#xff09;根据工作原理和适用场景的不同&#xff0c;主要分为以下三种类型&#xff0c;每种类型的特点和适用场景如下&#xff1a; 1. 后备式UPS&#xff08;Offline/Standby UPS&#xff09; 工作原理&#xff1a; 正常供电时&#xff0c;负载直接…

一级菜单401问题

正常代码生成的前后台文件&#xff0c;菜单类型是一级标题&#xff0c; 菜单路径和前端组件的地址都正常写的:/projects/xxx/xxx/xxx/XxxList 其他生成的新列表都能点进去&#xff0c;只有这个点进去就是显示空白的像首页那个页面一样&#xff0c; 问题就出现在我第一次建这…

ROS2 robot控制学习(一)

controller_position.yaml使用说明 ROS 2 的 controller_manager 用途典型工作流程示例关键服务与话题扩展功能JointTrajectoryController 参数详解基本参数轨迹参数插值参数前馈控制代码示例动态参数调试参数ForwardCommandController 概述参数解释`joints``interface``allow_…

LightGBM的python实现及参数优化

文章目录 1. LightGBM模型参数介绍2. 核心优势3. python实现LightGBM3.1 基础实现3.1.1 Scikit-learn接口示例3.1.2 Python API示例 3.2 模型调优3.2.1 GridSearchCV简介3.2.2 LightGBM超参调优3.2.3 GridSearchCV寻优结果 在之前的文章 Boosting算法【AdaBoost、GBDT 、XGBoo…

Map集合(双列集合)

Map结合也称为“键值对集合”&#xff0c;格式&#xff1a;{key1value1&#xff0c;key2value2....} Map集合的特点&#xff1a; 键唯一&#xff1a;在Map集合中&#xff0c;键&#xff08;key&#xff09;是唯一的&#xff0c;不能有重复的键。如果尝试插入一个已经存在的键…

springBoot项目测试时浏览器返回406问题解决方案

1. 如果基于最新版本的SpringBoot官方骨架创建的SpringBoot项目&#xff0c;在勾选了lombok的依赖之后&#xff0c;会在pom.xml中引入如下两个插件&#xff1a; 2. 由于第一个插件 maven-compiler-plugin 的引入导致了这个问题&#xff0c;解决这个问题的方案呢&#xff0c;就是…

21.享元模式:思考与解读

原文地址:享元模式&#xff1a;思考与解读 更多内容请关注&#xff1a;深入思考与解读设计模式 引言 在软件开发中&#xff0c;特别是当你处理大量相似对象时&#xff0c;是否会遇到一个问题&#xff1a;大量的对象会占用大量的内存&#xff0c;而这些对象有许多相同的状态&…

java方法重写学习笔记

方法重写介绍 子类和父类有两个返回值&#xff0c;参数&#xff0c;名称都一样的方法&#xff0c; 子类的方法会覆盖父类的方法。 调用 public class Overide01 {public static void main(String[] args) {Dog dog new Dog();dog.cry();} }Animal类 public class Animal {…

什么是ESLint?它有什么作用?

ESLint 是一个用于 静态代码分析 的工具,专门检测 JavaScript/TypeScript 代码中的潜在问题和风格违规。它通过预定义的规则集帮助开发者保持代码的一致性和质量,是前端工程化的核心工具之一。 一、ESLint 的核心作用 1. 错误检查(Error Detection) 识别语法错误、未定义变…

Docker的网络介绍

网络简单介绍 在介绍 Docker 的网络模式之前&#xff0c;先简单说下我们在使用 Vmware 虚拟机中的网络模式&#xff0c;形成对比&#xff0c;更好理解。 1、Vmware 中的网络模式 1.1、VMnet0&#xff08;桥接模式&#xff09; 虚拟机通过宿主机的物理网卡直接连接到外部网络…