文件加密實現

一、不依賴外部庫實現

使用自定義的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
英文地址,請注明出處:http://en.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、…