MCPcopy Create free account
hub / github.com/QMHTMY/RustBook / encode_to_base58

Method encode_to_base58

publication/code/chapter10/base58.rs:45–99  ·  view source on GitHub ↗
(&self)

Source from the content-addressed store, hash-verified

43// 实现 base58 编码
44impl Encoder for str {
45 fn encode_to_base58(&self) -> String {
46 // 转换为 bytes 来处理
47 let str_u8 = self.as_bytes();
48
49 // 统计前置 0 个数
50 let zero_count = str_u8.iter()
51 .take_while(|&&x| x == 0)
52 .count();
53
54 // 转换后所需空间:log(256)/log(58) 约为原数据 1.38 倍
55 // 前置 0 不需要,所以要减去
56 let size = (str_u8.len() - zero_count) * 138 / 100 + 1;
57
58 // 字符进制转换
59 let mut i = zero_count;
60 let mut high = size - 1;
61 let mut buffer = vec![0u8; size];
62 while i < str_u8.len() {
63 // j 为逐渐减小的下标,对应从后往前
64 let mut j = size - 1;
65
66 // carry 为从前往后读取的字符
67 let mut carry = str_u8[i] as u32;
68
69 // 将数据从后往前依次存放
70 while j > high || carry != 0 {
71 carry += 256 * buffer[j] as u32;
72 buffer[j] = (carry % BIG_RADIX) as u8;
73 carry /= BIG_RADIX;
74
75 if j > 0 {
76 j -= 1;
77 }
78 }
79
80 i += 1;
81 high = j;
82 }
83
84 // 处理多个前置 0
85 let mut b58_str = String::new();
86 for _ in 0..zero_count {
87 b58_str.push(ALPHABET_INDEX_0);
88 }
89
90 // 获取编码后的字符并拼接成字符串
91 let mut j = buffer.iter().take_while(|&&x| x == 0).count();
92 while j < size {
93 b58_str.push(ALPHABET[buffer[j] as usize] as char);
94 j += 1;
95 }
96
97 // 返回编码后字符串
98 b58_str
99 }
100}
101
102// 实现 base58 解码

Callers

nothing calls this directly

Calls 3

iterMethod · 0.45
lenMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected