202003 rust 1.42.0编译通过。升级为单线程加管道,想必效率会高一些。
20191114,rust 1.39 编译通过,增加了注释,有些所有权的东西算是理解了
rust 1.27.2编译通过。算法很烂,其中一些 变量的生存周期和所有权转移之类都还不完全明确。先记录下来。
吐槽一下,为啥代码样式没有rust的
/*
base64code
202003 升级了编码和解码两个方法,单线程加管道,在老代码的后面。想必效率会提高一些。
*/
use std::collections::HashMap;
use std::string::String;
//-------------
use std::sync::mpsc;
use std::thread;
//use std::sync::Mutex;
use std::sync::{Arc, Mutex};
use std::time::Duration;
// 模块形式就要注释这句,如果是bin执行模式 编译就放开这句
// fn main() {
// println!("Hello, world!");
// // base64测试
// base64_test();
// }
// base64测试方法
pub fn base64_test() {
let source_txt = String::from("愤怒是魔鬼");
println!("原文:{:?}", source_txt);
let b64 = base64encode(&source_txt);
println!("原文转换base64 utf-8编码: {:?}", b64);
let sb64 = base64decode(&b64);
println!("base64编码再转换原文 utf-8编码: {:?}", sb64);
}
/// rust 1.27.2编译通过,但是有警告好像
/// base64 编码 算法很烂,还有巨大优化空间
/// 输入一个 字符串 地址 ,这里是&借用,不获取所有权。 返回一个字符串,将所有权返出函数体外
pub fn base64encode(code: &String) -> String {
let mut result = String::from(""); // 用于存储 结果变量,所以是 mut可变的
let bytes = code.as_bytes(); // utf-8转换的byte数组,数据基准
let len = bytes.len(); // 数组长度
let mut byte_array: [u8; 3] = [0; 3]; // u8;3单个数组,转换过程中用于存储
let mut byte_vec: Vec = Vec::new(); // 存放u8;3的队列
// 这一段整体含义是 将byte数组每3个一组拆分,然后放入 Vec
for (i, &item) in bytes.iter().enumerate() {
// 循环byte数组
let y = i % 3; // 获得余数 数组角标
byte_array[y] = item; // byte拷贝值存入 u8;3 数组//不用clone()也没问题
if y == 2 || i == (len - 1) {
// 存到一组结尾,和总结尾时
// println!(" push {:?}", &byte_array);
// 这里是将 byte_array 拷贝进入 byte_vec。 不是引用进去从而不必考虑所有权问题。
byte_vec.push(byte_array); // 整体拷贝u8;3数组到 转换队列中,这里没用clone(),居然也行!
byte_array = [0; 3]; // 重置u8;3数组
}
}
//println!(" byte_vec == {:?}", byte_vec); // 打印一下,可以不打印
let b_len = byte_vec.len(); // u8;3数组队列长度。决定了转换循环次数
// 下面这一段就是 转换 主体 过程 ,具体的字节位移在 后面的函数里面
for (i, &item) in byte_vec.iter().enumerate() {
// 循环u8;3 队列 vector
let a4 = trans_a4(&item); // 转换 u8;4 数组,将 u8;3 转换成 u8;4
// 转换成 u8;4 后 先处理前两位,将对应的字符串提取出来
result.push(b64_to_char(a4[0])); // 这里后面都是根据对照表提取字符然后存入转换结果
result.push(b64_to_char(a4[1])); // b64_to_char 内部将字符拷贝值 传出函数返回给 result。 result有字符所有权
if b_len == i + 1 {
// 结尾处理 最后一位 (最后组,可能有最多两个位置是0)
if a4[2] == 0u8 {
// 值为0 用等号填充,非零就正常填充
result.push('='); // 结尾处要独立处理 = 号的问题
} el