文件加密实现

一、不依赖外部库实现

使用自定义的XOR加密算法结合简单的密钥扩展。

实现说明

这个方案不依赖任何外部库,仅使用C++标准库实现:

  1. 加密原理:采用XOR加密算法,这是一种简单但有效的对称加密方式,相同的密钥可以用于加密和解密
  2. 密钥处理:实现了密钥扩展功能,确保短密码可以加密任意长度的内容
  3. 用户管理:使用简单的哈希函数存储密码(而非明文),支持用户添加和验证
  4. 文件操作:以二进制方式读写文件,确保加密数据正确存储
// markdown_encryptor.h
#include <string>
#include <map>
#include <sstream>
#include <fstream>
#include <cstdint>
class MarkdownEncryptor {
private:// 存储用户名和密码哈希std::map<std::string, std::string> users;// 简单的哈希函数,用于密码存储std::string simpleHash(const std::string& input);// 密钥扩展,将短密码扩展为与数据长度匹配的密钥std::string expandKey(const std::string& password, size_t dataLength);public:// 添加用户bool addUser(const std::string& username, const std::string& password);// 验证用户bool verifyUser(const std::string& username, const std::string& password);// 加密ostringstream中的内容std::string encrypt(const std::ostringstream& markdown, const std::string& password);// 解密内容std::string decrypt(const std::string& encryptedData, const std::string& password);// 保存加密数据到文件bool saveToFile(const std::string& data, const std::string& filename);// 从文件加载加密数据std::string loadFromFile(const std::string& filename);
};// markdown_encryptor.cpp
// 简单的哈希函数实现
std::string MarkdownEncryptor::simpleHash(const std::string& input) {uint32_t hash = 0x811c9dc5; // 初始化值for (char c : input) {hash ^= static_cast<uint8_t>(c);hash *= 0x01000193; // 质数乘数}// 转换为十六进制字符串char buffer[9];snprintf(buffer, sizeof(buffer), "%08x", hash);return std::string(buffer);
}// 密钥扩展函数
std::string MarkdownEncryptor::expandKey(const std::string& password, size_t dataLength) {if (password.empty()) return "";std::string expanded;expanded.reserve(dataLength);size_t keyIndex = 0;for (size_t i = 0; i < dataLength; ++i) {expanded += password[keyIndex];keyIndex = (keyIndex + 1) % password.size();}return expanded;
}// 添加用户
bool MarkdownEncryptor::addUser(const std::string& username, const std::string& password) {if (users.find(username) != users.end()) {return false; // 用户已存在}// 存储哈希后的密码,而不是明文users[username] = simpleHash(password);return true;
}// 验证用户
bool MarkdownEncryptor::verifyUser(const std::string& username, const std::string& password) {auto it = users.find(username);if (it == users.end()) {return false; // 用户不存在}// 比较哈希值return it->second == simpleHash(password);
}// 加密实现 - 使用XOR算法
std::string MarkdownEncryptor::encrypt(const std::ostringstream& markdown, const std::string& password) {std::string data = markdown.str();if (data.empty() || password.empty()) return "";std::string key = expandKey(password, data.size());std::string encrypted;encrypted.reserve(data.size());// XOR加密for (size_t i = 0; i < data.size(); ++i) {encrypted += data[i] ^ key[i];}return encrypted;
}// 解密实现 - XOR算法解密(与加密相同)
std::string MarkdownEncryptor::decrypt(const std::string& encryptedData, const std::string& password) {if (encryptedData.empty() || password.empty()) return "";std::string key = expandKey(password, encryptedData.size());std::string decrypted;decrypted.reserve(encryptedData.size());// XOR解密(与加密算法相同)for (size_t i = 0; i < encryptedData.size(); ++i) {decrypted += encryptedData[i] ^ key[i];}return decrypted;
}// 保存到文件
bool MarkdownEncryptor::saveToFile(const std::string& data, const std::string& filename, bool append = false) {// 根据append参数选择打开模式std::ios_base::openmode mode = std::ios::binary;if (append) {mode |= std::ios::app;  // 追加模式} else {mode |= std::ios::trunc; // 截断模式(默认,覆盖文件)}std::ofstream file(filename, mode);if (!file.is_open()) {return false;}file.write(data.data(), data.size());return true;
}// 从文件加载
std::string MarkdownEncryptor::loadFromFile(const std::string& filename) {std::ifstream file(filename, std::ios::binary | std::ios::ate);if (!file.is_open()) {return "";}std::streamsize size = file.tellg();file.seekg(0, std::ios::beg);std::string data(size, '\0');if (file.read(&data[0], size)) {return data;}return "";
}// main.cpp
int main() {// 创建加密器实例MarkdownEncryptor encryptor;// 添加用户std::string username = "editor";std::string password = "mySecretPass123";if (encryptor.addUser(username, password)) {std::cout << "用户 '" << username << "' 创建成功" << std::endl;} else {std::cout << "用户 '" << username << "' 创建失败(可能已存在)" << std::endl;return 1;}// 验证用户if (encryptor.verifyUser(username, password)) {std::cout << "用户验证成功,可以进行加密操作" << std::endl;} else {std::cout << "用户验证失败,无法继续" << std::endl;return 1;}// 创建Markdown内容std::ostringstream markdown;markdown << "# 项目规划文档\n"<< "这是一个需要加密保护的内部文档。\n\n"<< "## 核心目标\n"<< "- 完成产品迭代\n"<< "- 优化用户体验\n"<< "- 提升系统性能\n\n"<< "## 时间节点\n"<< "- 阶段一:2025年9月完成\n"<< "- 阶段二:2025年11月完成\n";// 加密内容std::string encrypted = encryptor.encrypt(markdown, password);if (encrypted.empty()) {std::cout << "加密失败" << std::endl;return 1;}// 保存到文件// encryptor.saveToFile(encrypted, "project_plan.enc", true) 追加内容到文件(而不是覆盖)if (encryptor.saveToFile(encrypted, "project_plan.enc")) {std::cout << "加密文件已保存为 project_plan.enc" << std::endl;} else {std::cout << "保存文件失败" << std::endl;return 1;}// 从文件加载并解密std::string loadedData = encryptor.loadFromFile("project_plan.enc");if (loadedData.empty()) {std::cout << "加载文件失败" << std::endl;return 1;}std::string decrypted = encryptor.decrypt(loadedData, password);if (decrypted.empty()) {std::cout << "解密失败,可能密码错误" << std::endl;return 1;}// 显示解密后的内容std::cout << "\n解密成功,内容如下:\n" << std::endl;std::cout << decrypted << std::endl;return 0;
}
安全性

这种基础加密方案适合简单场景,但安全性不如专业加密算法:

  • 优点:实现简单,无外部依赖,适合快速集成
  • 缺点:安全性有限,不适合保护高度敏感信息
使用方法
  1. 编译所有文件(无需链接额外库)
  2. 创建加密器实例并添加用户
  3. 验证用户后,使用密码加密文件内容
  4. 保存加密文件,解密时使用相同密码
    这种实现可以直接嵌入到你的项目中,无需担心外部依赖问题。
    要实现对文本的加密保护并支持用户密码功能,我们可以使用AES加密算法结合密码哈希来实现。下面是一个C++实现方案,使用OpenSSL库提供加密功能:

二、依赖OpenSSL库

使用 AES 加密算法结合密码哈希来实现,OpenSSL 库提供加密功能

#include <string>
#include <vector>
#include <map>
#include <ostringstream>
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <openssl/rand.h>
#include <openssl/sha.h>
#include <fstream>
#include <iostream>// markdown_encryptor.h
class MarkdownEncryptor {
private:// 用户存储:用户名 -> 密码哈希std::map<std::string, std::string> users;// 盐值长度static const int SALT_LENGTH = 16;// 密钥长度 (AES-256)static const int KEY_LENGTH = 32;// IV向量长度static const int IV_LENGTH = 16;// 迭代次数static const int ITERATIONS = 10000;// 从密码和盐值生成密钥std::vector<unsigned char> generateKey(const std::string& password, const unsigned char* salt);// 哈希密码用于用户认证std::string hashPassword(const std::string& password, const unsigned char* salt);// 生成随机盐值std::vector<unsigned char> generateSalt();public:MarkdownEncryptor() = default;// 添加用户bool addUser(const std::string& username, const std::string& password);// 验证用户密码bool verifyUser(const std::string& username, const std::string& password);// 加密markdown内容std::string encrypt(const std::ostringstream& markdownContent, const std::string& password);// 解密内容std::string decrypt(const std::string& encryptedData, const std::string& password);// 保存加密数据到文件bool saveToFile(const std::string& encryptedData, const std::string& filename);// 从文件加载加密数据std::string loadFromFile(const std::string& filename);
};// markdown_encryptor.cpp
std::vector<unsigned char> MarkdownEncryptor::generateSalt() {std::vector<unsigned char> salt(SALT_LENGTH);if (RAND_bytes(salt.data(), SALT_LENGTH) != 1) {throw std::runtime_error("Failed to generate salt");}return salt;
}std::vector<unsigned char> MarkdownEncryptor::generateKey(const std::string& password, const unsigned char* salt) {std::vector<unsigned char> key(KEY_LENGTH);if (PKCS5_PBKDF2_HMAC_SHA1(password.c_str(), password.length(),salt, SALT_LENGTH,ITERATIONS, KEY_LENGTH,key.data()) != 1) {throw std::runtime_error("Failed to generate key");}return key;
}std::string MarkdownEncryptor::hashPassword(const std::string& password, const unsigned char* salt) {unsigned char hash[SHA256_DIGEST_LENGTH];std::vector<unsigned char> key = generateKey(password, salt);SHA256(key.data(), key.size(), hash);std::string hashStr;for (int i = 0; i < SHA256_DIGEST_LENGTH; ++i) {char buf[3];sprintf(buf, "%02x", hash[i]);hashStr += buf;}return hashStr;
}bool MarkdownEncryptor::addUser(const std::string& username, const std::string& password) {if (users.find(username) != users.end()) {return false; // 用户已存在}try {std::vector<unsigned char> salt = generateSalt();std::string saltStr(reinterpret_cast<char*>(salt.data()), salt.size());std::string passwordHash = hashPassword(password, salt.data());// 存储格式: 盐值 + 哈希值users[username] = saltStr + passwordHash;return true;} catch (...) {return false;}
}bool MarkdownEncryptor::verifyUser(const std::string& username, const std::string& password) {auto it = users.find(username);if (it == users.end()) {return false; // 用户不存在}std::string storedData = it->second;if (storedData.length() < SALT_LENGTH) {return false; // 数据无效}// 提取盐值std::vector<unsigned char> salt(SALT_LENGTH);memcpy(salt.data(), storedData.c_str(), SALT_LENGTH);// 计算哈希并比较std::string passwordHash = hashPassword(password, salt.data());return passwordHash == storedData.substr(SALT_LENGTH);
}std::string MarkdownEncryptor::encrypt(const std::ostringstream& markdownContent, const std::string& password) {try {// 生成盐值和密钥std::vector<unsigned char> salt = generateSalt();std::vector<unsigned char> key = generateKey(password, salt.data());// 生成IV向量unsigned char iv[IV_LENGTH];if (RAND_bytes(iv, IV_LENGTH) != 1) {throw std::runtime_error("Failed to generate IV");}// 获取要加密的数据std::string plaintext = markdownContent.str();// 准备加密上下文EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();if (!ctx) {throw std::runtime_error("Failed to create cipher context");}// 初始化加密操作if (EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key.data(), iv) != 1) {EVP_CIPHER_CTX_free(ctx);throw std::runtime_error("Failed to initialize encryption");}// 计算加密后的数据长度int ciphertext_len = plaintext.length() + AES_BLOCK_SIZE;std::vector<unsigned char> ciphertext(ciphertext_len);// 执行加密int len;if (EVP_EncryptUpdate(ctx, ciphertext.data(), &len, reinterpret_cast<const unsigned char*>(plaintext.c_str()), plaintext.length()) != 1) {EVP_CIPHER_CTX_free(ctx);throw std::runtime_error("Encryption failed");}ciphertext_len = len;// 完成加密if (EVP_EncryptFinal_ex(ctx, ciphertext.data() + len, &len) != 1) {EVP_CIPHER_CTX_free(ctx);throw std::runtime_error("Final encryption step failed");}ciphertext_len += len;// 释放上下文EVP_CIPHER_CTX_free(ctx);// 存储格式: 盐值 + IV + 密文长度 + 密文std::string result;result.append(reinterpret_cast<char*>(salt.data()), salt.size());result.append(reinterpret_cast<char*>(iv), IV_LENGTH);result.append(reinterpret_cast<char*>(&ciphertext_len), sizeof(int));result.append(reinterpret_cast<char*>(ciphertext.data()), ciphertext_len);return result;} catch (const std::exception& e) {std::cerr << "Encryption error: " << e.what() << std::endl;return "";}
}std::string MarkdownEncryptor::decrypt(const std::string& encryptedData, const std::string& password) {try {// 检查数据长度是否足够if (encryptedData.length() < SALT_LENGTH + IV_LENGTH + sizeof(int)) {throw std::runtime_error("Invalid encrypted data");}// 提取盐值std::vector<unsigned char> salt(SALT_LENGTH);memcpy(salt.data(), encryptedData.c_str(), SALT_LENGTH);// 提取IV向量unsigned char iv[IV_LENGTH];memcpy(iv, encryptedData.c_str() + SALT_LENGTH, IV_LENGTH);// 提取密文长度int ciphertext_len;memcpy(&ciphertext_len, encryptedData.c_str() + SALT_LENGTH + IV_LENGTH, sizeof(int));// 提取密文const unsigned char* ciphertext = reinterpret_cast<const unsigned char*>(encryptedData.c_str() + SALT_LENGTH + IV_LENGTH + sizeof(int));// 生成密钥std::vector<unsigned char> key = generateKey(password, salt.data());// 准备解密上下文EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();if (!ctx) {throw std::runtime_error("Failed to create cipher context");}// 初始化解密操作if (EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key.data(), iv) != 1) {EVP_CIPHER_CTX_free(ctx);throw std::runtime_error("Failed to initialize decryption");}// 计算明文长度int plaintext_len = ciphertext_len;std::vector<unsigned char> plaintext(plaintext_len);// 执行解密int len;if (EVP_DecryptUpdate(ctx, plaintext.data(), &len, ciphertext, ciphertext_len) != 1) {EVP_CIPHER_CTX_free(ctx);throw std::runtime_error("Decryption failed");}plaintext_len = len;// 完成解密if (EVP_DecryptFinal_ex(ctx, plaintext.data() + len, &len) != 1) {EVP_CIPHER_CTX_free(ctx);throw std::runtime_error("Final decryption step failed - incorrect password?");}plaintext_len += len;// 释放上下文EVP_CIPHER_CTX_free(ctx);// 返回明文return std::string(reinterpret_cast<char*>(plaintext.data()), plaintext_len);} catch (const std::exception& e) {std::cerr << "Decryption error: " << e.what() << std::endl;return "";}
}bool MarkdownEncryptor::saveToFile(const std::string& encryptedData, const std::string& filename) {std::ofstream file(filename, std::ios::binary);if (!file) {return false;}file.write(encryptedData.data(), encryptedData.size());return true;
}std::string MarkdownEncryptor::loadFromFile(const std::string& filename) {std::ifstream file(filename, std::ios::binary | std::ios::ate);if (!file) {return "";}std::streamsize size = file.tellg();file.seekg(0, std::ios::beg);std::string data(size, '\0');if (file.read(&data[0], size)) {return data;}return "";
}// main.cpp
int main() {// 创建加密器实例MarkdownEncryptor encryptor;// 添加用户std::string username = "user1";std::string password = "securePassword123";if (encryptor.addUser(username, password)) {std::cout << "用户 " << username << " 创建成功" << std::endl;} else {std::cout << "用户 " << username << " 创建失败" << std::endl;return 1;}// 验证用户if (encryptor.verifyUser(username, password)) {std::cout << "用户验证成功" << std::endl;} else {std::cout << "用户验证失败" << std::endl;return 1;}// 创建一个markdown内容std::ostringstream markdown;markdown << "# 我的秘密文档\n"<< "这是一个加密的文档。\n"<< "## 章节1\n"<< "包含一些敏感信息...\n"<< "## 章节2\n"<< "更多的秘密内容...\n";// 加密内容std::string encrypted = encryptor.encrypt(markdown, password);if (encrypted.empty()) {std::cout << "加密失败" << std::endl;return 1;}// 保存到文件if (encryptor.saveToFile(encrypted, "secret.md.enc")) {std::cout << "加密文件已保存" << std::endl;} else {std::cout << "保存文件失败" << std::endl;return 1;}// 从文件加载std::string loaded = encryptor.loadFromFile("secret.md.enc");if (loaded.empty()) {std::cout << "加载文件失败" << std::endl;return 1;}// 解密内容std::string decrypted = encryptor.decrypt(loaded, password);if (decrypted.empty()) {std::cout << "解密失败 - 可能密码错误" << std::endl;return 1;}// 显示解密后的内容std::cout << "\n解密后的内容:\n" << decrypted << std::endl;return 0;
}
实现说明

这个解决方案提供了以下功能:

  1. 加密算法:使用AES-256-CBC对称加密算法,提供高强度加密保护
  2. 密钥派生:使用PBKDF2算法从密码生成加密密钥,增加暴力破解难度
  3. 用户管理:支持添加用户和密码验证功能
  4. 数据存储:将加密数据保存到文件,包含所有必要的元数据(盐值、IV向量等)
使用方法
  1. 创建MarkdownEncryptor实例
  2. 使用addUser添加用户账号和密码
  3. 使用verifyUser验证用户身份
  4. std::ostringstream中的markdown内容使用encrypt方法加密
  5. 使用saveToFile保存加密后的数据
  6. 解密时,先用loadFromFile加载数据,再用decrypt方法解密
编译注意事项

需要链接OpenSSL库进行编译,例如:

g++ main.cpp markdown_encryptor.cpp -o markdown_encrypt -lcrypto

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

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

相关文章

Unity轻量观察相机

一、脚本功能简介ObserveCamera 是一个可直接挂载到任意 GameObject 上的通用摄像机控制脚本&#xff0c;支持以下功能&#xff1a;鼠标右键控制摄像机绕自身旋转&#xff08;俯仰、水平&#xff09;鼠标左键拖拽目标对象进行平移&#xff08;局部 XY 平面移动&#xff09;鼠标…

1深度学习Pytorch-pytorch、tensor的创建、属性、设备和类型转换、数据转换、常见操作(获取元素、元素运算、形状改变、相乘、广播)

文章目录PyTorchTensor1 Tensor 的创建1.torch.tensor2.torch.Tensor3. 线性张量4. 随机张量5. 特定数值的张量2 Tensor 常见属性1 属性2 设备切换3 类型转换torch.Tensor.to(dtype)类型专用方法创建张量时直接指定类型与 NumPy 数组的类型互转4 数据转换&#xff08;浅拷贝与深…

五、Istio管理网格外部服务

因语雀与csdn markdown 格式有区别&#xff0c;请查看原文&#xff1a; https://www.yuque.com/dycloud/pss8ys 一、Egress Listener 流量策略 前面学习了 sidecar 自动注入原理、inbound Listener、outbound Listener 等概念&#xff0c;也知道了 EgressListener 的流量策略…

Ubuntu20.04 离线安装 FFmpeg 静态编译包

系统版本 Ubuntu20.04 去现场部署项目&#xff0c;发现现场的设备连接的内网&#xff0c;无法使用apt直接安装ffmpeg &#xff0c;想解决也简单&#xff0c;数据线连接手机使用共享网络&#xff0c;再使用命令sudo apt install ffmpeg安装即可&#xff0c;奈何现场百多台设备&a…

C语言高级编程技巧与最佳实践

C语言高级编程技巧与最佳实践 - 完整版 目录 宏定义与预处理技巧内存管理高级技巧函数指针与回调机制数据结构设计并发与多线程错误处理与异常机制性能优化技巧调试与测试技巧跨平台编程安全编程实践综合演示示例 宏定义与预处理技巧 1. 条件编译与平台检测 /*** 平台和编译…

cygwin+php教程(swoole扩展+redis扩展)

cygwin 1.下载cygwin安装程序 &#xff1a;在Windows上获得Linux的感觉 ​ 2. 打开安装包&#xff1a;setup-x86_64.exe 3.选择安装类型 从互联网安装首次安装下载而不安装仅下载软件包不安装从本地目录安装迁移程序时使用 4.选择安装目录 5.选择本地软件包目录&#xff…

Ethereum: Uniswap V3核心”Tick”如何引爆DEX的流动性革命?

大家好&#xff0c;今天&#xff0c;我们来聊聊一个在去中心化交易所&#xff08;DEX&#xff09;领域&#xff0c;尤其是自Uniswap V3问世以来&#xff0c;变得至关重要的概念——Tick&#xff08;流动性边界&#xff09;。 如果大家接触过DeFi&#xff0c;可能听说过Uniswap …

【概念学习】什么是深度学习

人工智能 人工智能的简洁定义如下&#xff1a;努力将通常由人类完成的智力任务自动化。 因此&#xff0c;人工智能是一个综合性的领域&#xff0c;不仅包括机器学习与深度学习&#xff0c;还包括更多不涉及学习的方法。 在相当长的时间内&#xff0c;许多专家相信&#xff0c;只…

【MATLAB】(八)矩阵

一.矩阵的定义MATLAB 以矩阵作为数据操作的基本单位&#xff0c;这使得矩阵运算变得非常简捷、方便、高效。矩阵是由m*n个数q(i1,2,…,m&#xff1b;j1,2,…,n)&#xff0c;排成的m行n列数表&#xff0c;记成称为 mxn 矩阵&#xff0c;也可以记成aij或Am*n。其中,i表示行数,j表…

python的高校考研交流系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具&#xff1a;Navicat/SQLyog等都可以 在当今社…

从零开始部署Qwen3-8b大模型到本地

一、方法一&#xff08;使用docker镜像进行部署&#xff09; 安装Linux服务器&#xff0c;本机测试系统为Ubuntu系统&#xff1b;(带有2张A100的GPU服务器) 思路为&#xff1a;使用docker部署python环境镜像在此基础上安装vllm拉取Qwen3-8b模型 docker-compose.yml文件部分配…

AI产品经理如何理解和应用Transformer架构,以提升产品的技术能力和用户体验?

​你好&#xff0c;我是 ✨三桥君✨ 助你迈向AGI时代&#xff01;&#xff01;&#xff01; &#x1f4cc;本文介绍&#x1f4cc; >> 一、引言 在当今的AI浪潮中&#xff0c;Transformer架构已不再是一个陌生的技术名词。从OpenAI的GPT系列到Google的BERT&#xff0c;再…

数据结构(四)内核链表、栈与队列

一、内核链表基础1. 什么是 Linux 内核链表&#xff1f;Linux 内核链表是一种高效的 双向循环链表&#xff0c;广泛应用于内核模块开发中&#xff0c;用于管理数据结构。每个节点通过指针连接前一个和后一个元素&#xff0c;实现插入和删除的高性能。2. 链表的定义与初始化在 L…

软考信息安全工程师11月备考

目前是在职备考&#xff0c;主业是移动端开发工程师。第一个月(8.4-9.6)&#xff0c;将分享完下面所有章节内容&#xff0c;平均不到两天更新一节1.网络信息安全概述2.网络攻击原理与常用方法3.密码学基本理论4.网络安全体系与网络安全模型5.物理与环境安全技术6.认证技术与原理…

使用DrissionPage实现xhs笔记自动翻页并爬取笔记视频、图片

使用DrissionPage实现xhs笔记自动翻页并爬取笔记视频、图片 声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经…

使用 input 上传文件, 选择文件后再次修改文件再上传失败( <input type=“file“ /> 自定义上传)

业务实际需求&#xff1a;点击【选择】按钮先选择文件&#xff0c;展示文件的详情&#xff1a;类型&#xff0c;大小&#xff0c;日期......点击【上传】按钮这个时候才去上传文件如图&#xff1a;BUG复现&#xff1a;点击上传文件后发现xlsx文件有些数据没填写&#xff0c;然后…

Win11 下解决 VScode/Trae 插件加载慢, 整个 VScode/Trae 很卡

最近在使用 Trae 写代码, 突然变得很卡, 尤其是插件系统, 比如我打开插件的面板, 以及比如我想预览一下写好的 .md 文件 (已安装了 Markdown Preview Enhanced 插件), 这些都要好几分钟才能打开. 最初以为是 Trae 坏掉了, 然后重启 Trae 不管用, 再重启电脑居然也不管用, 接着…

微型导轨:智能家居抽屉的智能化应用

当智能家居从“功能堆砌”转向“体验升级”&#xff0c;微型导轨凭借超薄结构、静音运行与精准定位能力&#xff0c;成为隐藏式设计、自动化交互的核心部件&#xff0c;让家具“动”得优雅且可靠。智能扫地机器人&#xff1a;微型导轨被应用于边刷的伸缩调节机构&#xff0c;能…

百套易语言教程、易语言视频教程【易语言编程入门教程】

百套易语言教程、易语言视频教程【易语言编程入门教程】 易语言辅助教程&#xff08;爱易编程论坛讲师 24课讲师&#xff1a;远航 9课爱易编程论坛讲师&#xff1a;爱易、小Call 8课&#xff09;.rar 时光论坛易语言全套教程【易语言零基础易语言抓包易语言填表】完整版.rar 易…

nlp-词汇分析

目录 一、语言中的词汇 1、词的形态学 2、词的词性 二、词语规范化 1、词语切分 2、词形还原 3、词干提取 三、中文分词 1、概述 2、基于最大匹配的中文分词 3、基于线性链条件随机场的中文分词 4、基于感知器的中文分词 词序列预测 模型参数学习 特征定义 5、…