Rust 实战练习 - 9. 文本编码,URL编码,加密解密
编解码
编程工作中,很复杂的一个环节的就是编解码和多语言。这里只讨论编解码的工作。
目标:
- 常见文本编码的转换(GBK, Shift-JIS, UTF8, Unicode, ASCII)
- Web中常用的编码
- 常见的加密算法(md5, sha1, HMAC, AES/DES, RSA)
encoding/decoding
在官方的库中搜索一下:
https://docs.rs/
简单了解一下
(吐槽一下,rust官方的std库支持的太少了,啥都要第三方库! 找起来参莠不齐,这点体验不太好)
[dependencies]
encoding = "*" # 各种字符编码
urlencoding = "*" # url path 对有影响的字符进行编码
base64 = "*" # base64的支持,提供细节定制功能
rsa = "*" # pcks1,pcks8的rsa支持,还可以互相转换
code
use std::mem::size_of;
use base64::Engine;
use encoding::{all::{ASCII, EUC_JP, GB18030, GBK}, Encoding};
use base64::engine::general_purpose;fn main() {println!("\r\n1. Rust内部使用UTF-8编码, char类型用4个字节.");let a1 = "hello, 我是Andy!🍓";println!("Bin: {:?}", a1.as_bytes());// 英文用1字符,中文用3个,emoji用4个.println!("{}, len: {}, chars len: {}", a1, a1.len(), a1.chars().count());// char 是一个 Unicode 标量值, 是除 代理代码点(0xD800 到 0xDFFF) 之外的任何 Unicode 代码点。// 大小始终为四个字节. 范围 0 到 0x10FFF.println!("char size: {}", size_of::<char>());println!("\r\n2. rust str to ASCII,GBK,GB18030...");// https://zhuanlan.zhihu.com/p/453675608// 编码范围从小到大: ASCII(1) => GB2312(2) => GBK(2) => GB18030(1-4)// UTF-8 to GBK, GB18030let b1 = "a 1 王 🍓";println!("Rust old: {:?}", b1.as_bytes());if let Ok(raw) = ASCII.encode(b1, encoding::EncoderTrap::Ignore) {println!("ASCII: {:?}", raw); // 中文和emoji不能转换println!("ASCII Decode: {:?}", ASCII.decode(raw.as_slice(), encoding::DecoderTrap::Ignore));}if let Ok(raw) = GBK.encode(b1, encoding::EncoderTrap::Ignore) {println!("GBK: {:?}", raw); // emoji不能转换println!("GBK Decode: {:?}", GBK.decode(raw.as_slice(), encoding::DecoderTrap::Ignore));}if let Ok(raw) = GB18030.encode(b1, encoding::EncoderTrap::Strict) {println!("GB18030: {:?}", raw); // 全部都能转换println!("GB18030 Decode: {:?}", GB18030.decode(raw.as_slice(), encoding::DecoderTrap::Ignore));}// include Shift-JISif let Ok(raw) = EUC_JP.encode(b1, encoding::EncoderTrap::Ignore) {println!("JP 932: {:?}", raw); // emoji不能转换println!("JP Decode: {:?}", EUC_JP.decode(raw.as_slice(), encoding::DecoderTrap::Ignore));}println!("\r\n3. url path encode and decode...");let c1 = "http://www.test.com/api/get?id=123+你好-🍓";println!("url encode: {}", urlencoding::encode(c1)); // 所有可能影响url的字符都被编码了println!("url decode: {}", urlencoding::decode("%F0%9F%91%BE%20Exterminate%21").unwrap());println!("\r\n4. base64 encode and decode...");// 当输入长度不是 3 个字节的偶数倍时,规范的 base64 编码器会在末尾插入填充字符,以便输出 长度始终是 4 的倍数let d1 = "hello, 123, @?&=-_, 啊";let d1_1 = general_purpose::STANDARD.encode(d1);let d1_2 = general_purpose::STANDARD.decode(d1_1.clone()).unwrap();println!("base64 encode: {}", d1_1);println!("base64 decode: {}", String::from_utf8(d1_2).unwrap());
}
加密和解密
https://zhuanlan.zhihu.com/p/347114235
目前没有比较全面的库,有一个目标类似,但是没有1.0的库:https://docs.rs/cryptocol/latest/cryptocol/.
缺失的部分可以使用 https://docs.rs/rsa/latest/rsa/
非对称加密
use cryptocol::hash::{MD5, SHA1};fn main() {println!("\r\n1. md5");let e1 = "some thing what can be any thing!";let mut md5= MD5::new();md5.digest_str(e1);println!("MD5 : {} - {:?}", md5.get_hash_value_in_string(), md5.get_hash_value_in_vec());md5.ruminate_str(2, e1); // 双重md5println!("MD5*2: {} - {:?}", md5.get_hash_value_in_string(), md5.get_hash_value_in_vec());println!("\r\n2. sha1");let mut sha1 = SHA1::new();sha1.digest_str(e1);println!("sha1 : {} - {:?}", sha1.get_hash_value_in_string(), sha1.get_hash_value_in_vec());sha1.ruminate_str(2, e1); // 双重sha1println!("sha1*2: {} - {:?}", sha1.get_hash_value_in_string(), sha1.get_hash_value_in_vec());
}
RSA
use rsa::{ pkcs8::{DecodePublicKey, EncodePublicKey}, RsaPublicKey};fn main() {println!("\r\n1. RSA pkcs8 public key for pem");let pem = "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtsQsUV8QpqrygsY+2+JC
Q6Fw8/omM71IM2N/R8pPbzbgOl0p78MZGsgPOQ2HSznjD0FPzsH8oO2B5Uftws04
LHb2HJAYlz25+lN5cqfHAfa3fgmC38FfwBkn7l582UtPWZ/wcBOnyCgb3yLcvJrX
yrt8QxHJgvWO23ITrUVYszImbXQ67YGS0YhMrbixRzmo2tpm3JcIBtnHrEUMsT0N
fFdfsZhTT8YbxBvA8FdODgEwx7u/vf3J9qbi4+Kv8cvqyJuleIRSjVXPsIMnoejI
n04APPKIjpMyQdnWlby7rNyQtE4+CV+jcFjqJbE/Xilcvqxt6DirjFCvYeKYl1uH
LwIDAQAB
-----END PUBLIC KEY-----";let public_key = RsaPublicKey::from_public_key_pem(pem).unwrap();println!("Public Key: {:?}", public_key);let pem2 = RsaPublicKey::to_public_key_pem(&public_key, rsa::pkcs8::LineEnding::CRLF).unwrap();println!("Public Key pem: {}", pem2); // 与pem相同// 公钥和私钥互相可解密对方加密的数据// 公钥是可以通过私钥生成的,所以公布了私钥很危险,但是公布公钥没问题// https://www.cnblogs.com/Dogwei/p/13412976.html
}
相关文章:
Rust 实战练习 - 9. 文本编码,URL编码,加密解密
编解码 编程工作中,很复杂的一个环节的就是编解码和多语言。这里只讨论编解码的工作。 目标: 常见文本编码的转换(GBK, Shift-JIS, UTF8, Unicode, ASCII)Web中常用的编码常见的加密算法(md5, sha1, HMAC, AES/DES, RSA) encoding/decodi…...
linux环境openfile限制
/etc/security/limits.conf 是 Linux 系统中用于设置用户资源限制的配置文件。这个文件允许系统管理员为每个用户或用户组设置各种资源限制,以防止用户滥用系统资源。 这个文件中的每一行都定义了一个资源限制。每一行通常包含以下字段(由空格或冒号分隔…...
python之pandas数据导入和导出
目录 Pandas 常用数据导入Pandas 常用数据导出数据导入示例CSV 文件:指定导入文件的编码格式添加列标题 Excel 文件:JSON 文件:数据库:HTML 表格:Clipboard:HDF5 文件:Feather 文件:…...
Docker 集成 redis,并在nacos进行配置时需要注意点
安装redis镜像 docker pull redis:6.0.6redis配置文件 创建相关配置文件 mkdir /apps/redis cd /apps/redis touch redis.conf vim redis.confredis.conf内容: #开启保护 protected-mode yes #开启远程连接 bind 0.0.0.0 #自定义密码 port 6379 timeout 0 # 900s内…...
数据库系统工程师考试大纲
数据库系统工程师考试大纲主要包括以下几个方面的考试要求: 1.掌握计算机体系结构以及各主要部件的性能和基本工作原理。 2.掌握操作系统、程序设计语言的基础知识,了解编译程序的基本概念。 3.熟练掌握常用数据结构和常用算法。 4.熟悉软件工程和软件开…...
(Java)数据结构——图(第七节)Folyd实现多源最短路径
前言 本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。 Folyd实现原理 中心点的概念 感觉像是充当一个桥梁的作用 还是这个图 我们常在一些讲解视频中看到,就比如dist(-1)࿰…...
使用Python进行高效的多线程HTTP请求
在处理网络请求时,尤其是当需要大量请求相同或不同的URL时,采用多线程的方式可以显著提高效率。本文介绍了如何使用Python的concurrent.futures模块实现多线程HTTP请求。 为什么使用多线程? 多线程可以让CPU和网络资源得到更有效的利用。在…...
如何利用OceanBase v4.2的 外部表简化外部数据处理
为什么需要使用外表 在日常的业务场景中,经常遇到需要在数据库中处理外部数据的情况,这些数据可能来源于应用程序,或者是其他业务系统。一般来说,常是通过ETL工具将外部数据库的数据导入到数据库内部的表中,再进行分析…...
【灵境矩阵】零代码创建AI智能体之行业词句助手
欢迎来到《小5讲堂》 这是《灵境矩阵》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 创建智能体选择创建方式零代码 基础配置头像名称简介指令开场白…...
springboot 防抖操作
大佬的代码:看这里 原理: 通过aop切面编程,在调用接口前缓存接口信息,将信息缓存到redis中,在规定时间内重复调用接口,会被拦截请求 有个地方感觉不太合理,在使用中我将其修改了 //前略 publi…...
Playwright录制脚本 —— web自动化测试!
简介: 在编写 web 自动化测试用例时,代码编写的速度是否快,会影响框架的使用体验。现在很多的框架都会提供一些辅助功能,帮助我们更快的去编写自动化测试代码,而录制功能是几乎所有的web自动化工具都会带的功能。在实际…...
什么是工业级物联网智能网关?如何远程控制PLC?
在数字化浪潮席卷全球的今天,工业物联网(IIoT)已经成为推动工业转型升级的关键力量。而在工业物联网的大家庭中,工业级物联网智能网关扮演着举足轻重的角色。那么,究竟什么是工业级物联网智能网关?又该如何…...
AI推介-大语言模型LLMs论文速览(arXiv方向):2024.04.05-2024.04.10
文章目录~ 1.Learn from Failure: Fine-Tuning LLMs with Trial-and-Error Data for Intuitionistic Propositional Logic Proving2.Continuous Language Model Interpolation for Dynamic and Controllable Text Generation3.Event Grounded Criminal Court View Generation w…...
javascript:call()、apply()、bind()的区别和使用
javascript:call()、apply()、bind()的区别和使用 1 前言 记录javascript的call、apply、bind方法绑定this的区别以及使用。 call、apply、bind的区别: 【相同点】:作用相同,都是动态修改this指向;都不会修改原先函…...
ubuntu系统安装systemc-2.3.4流程
背景:systemC编程在linux下的基础环境配置 1,下载安装包,并解压 (先下载了最新的3.0.0,安装时候显示sc_cmnhdr.h:115:5: error: #error **** SystemC requires a C compiler version of at least C17 **** ÿ…...
Java开发中的entity、vo和pojo
Java开发中的entity、vo和pojo 1.Entity实体2.vo3.pojo 1.Entity实体 定义: Entity 通常指的是与数据库表对应的对象。它包含了与数据库表字段相对应的属性和一些业务逻辑方法。Entity 通常用于数据的持久化操作,如增删改查。使用场景: 当需…...
通过IPV6+DDNS实现路由器远程管理和Win远程桌面控制
前期需要的准备: 软路由,什么系统都可以,要支持IPV6,能够自动添加解析 光猫的管理员账号,能够进入光猫修改配置,拨号上网账号 域名账号和DNS服务 主要步骤: 利用管理员账号,进入…...
数据湖/数据仓库
数据湖(Data Lake)和数据仓库(Data Warehouse)的主要区别在于它们的目的、存储的数据类型、数据处理方式、数据结构、数据安全性以及数据应用。以下是相关介绍: 目的。数据湖旨在作为一个集中的存储库,存储…...
万兆以太网MAC设计(2)MAC_RX模块
文章目录 前言一、模块功能二、代码三、仿真波形 前言 上文我们打通了了万兆以太网物理层和数据链路层,其实就是会使用IP核了,本文将正式开始MAC层设计第一篇,接收端设计。 一、模块功能 MAC_RX模块功能如下: 解析接收的报文&…...
D. Solve The Maze Codeforces Round 648 (Div. 2)
题目链接: Problem - 1365D - CodeforcesCodeforces. Programming competitions and contests, programming communityhttps://codeforces.com/problemset/problem/1365/D 题目大意: 有一张地图n行m列(地图外面全是墙),…...
罚到肉疼!2026“两个细则”大考:你的风电场还在用“注定不准”的方法做预测吗?
当95%置信概率成为国家标准,单点预测的时代彻底终结2026年的春天,对于新能源发电企业而言,比以往任何时候都要“寒冷”。山东、四川等地新版“两个细则”正式施行,国家发改委“136号文”深入落地,新能源全面进入电力市…...
如何在Photoshop中快速掌握AVIF格式:新手完整操作终极指南
如何在Photoshop中快速掌握AVIF格式:新手完整操作终极指南 【免费下载链接】avif-format An AV1 Image (AVIF) file format plug-in for Adobe Photoshop 项目地址: https://gitcode.com/gh_mirrors/avi/avif-format 还在为网站图片加载速度慢而烦恼吗&#…...
深度解析 ConcurrentHashMap 1.8:put 与 get 核心流程全解
在 Java 并发编程中,ConcurrentHashMap 是线程安全的高频使用集合,相比线程不安全的 HashMap、效率低下的 HashTable(全锁),JDK 1.8 版本的 ConcurrentHashMap 做了底层结构重构和锁机制优化,成为高并发场景…...
GitHub加速工具:解决开发者访问难题的终极方案
GitHub加速工具:解决开发者访问难题的终极方案 【免费下载链接】fetch-github-hosts 🌏 同步github的hosts工具,支持多平台的图形化和命令行,内置客户端和服务端两种模式~ | Synchronize GitHub hosts tool, support multi-platfo…...
终极Windows 11优化指南:一键清理系统臃肿,让电脑速度翻倍
终极Windows 11优化指南:一键清理系统臃肿,让电脑速度翻倍 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其…...
Flowable 7.x 实战:手把手教你从数据库里捞出BPMN2.0 XML并优雅展示(Vue3 + Spring Boot)
Flowable 7.x 实战:从数据库提取BPMN2.0 XML的工程化实现(Vue3 Spring Boot全链路解析) 在流程引擎的实际应用中,BPMN2.0 XML作为流程定义的标准化载体,其可视化展示能力直接影响开发调试效率。本文将完整演示如何构建…...
Qwen3.5-4B-Claude-Opus部署教程:supervisor托管+健康检查全流程详解
Qwen3.5-4B-Claude-Opus部署教程:supervisor托管健康检查全流程详解 1. 模型介绍 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF 是一个基于 Qwen3.5-4B 的推理蒸馏模型,重点强化了结构化分析、分步骤回答、代码与逻辑类问题的处理能力。该版本…...
三步掌握BepInEx插件框架:零基础也能懂的Unity游戏扩展指南
三步掌握BepInEx插件框架:零基础也能懂的Unity游戏扩展指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx作为Unity/XNA游戏的插件框架,为开发者和…...
AutoGen多智能体框架:从协作价值到企业级实践指南
AutoGen多智能体框架:从协作价值到企业级实践指南 【免费下载链接】autogen 启用下一代大型语言模型应用 项目地址: https://gitcode.com/GitHub_Trending/au/autogen 在人工智能快速发展的今天,如何让AI系统像人类团队一样高效协作完成复杂任务&…...
MoveIt 2 Launch文件进阶:如何用MoveItConfigsBuilder灵活切换规划器(OMPL vs. Pilz)
MoveIt 2规划器切换实战:用MoveItConfigsBuilder实现OMPL与Pilz工业规划器的动态选择 在工业机器人应用开发中,运动规划器的选择往往决定了任务执行的效率和质量。想象一下这样的场景:你的机械臂需要在杂乱环境中快速避障移动时,…...
