rust里mp5a4_Rust base64 编码解码 首个rust小作品【自用别吐我】

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值