如何将Rust中的usize值转换为对应的ASCII字节?
Rust 高效实现 usize 转 ASCII 字节数组
需要实现一个函数,将usize类型的数值转换为对应数字字符的ASCII字节数组(例如50usize转换为[53, 48],对应字符'5'和'0'的ASCII码),且要求最高效、最少拷贝的Rust惯用实现。
高效实现代码
fn usize_to_ascii_bytes(input: usize) -> Vec<u8> { // 处理0的特殊情况 if input == 0 { return vec![b'0']; } // 预分配足够容纳usize最大位数的缓冲区(64位usize最多20位) let mut buf = [0u8; 20]; let mut idx = buf.len(); let mut num = input; // 从低位到高位计算每一位的ASCII值,填充到缓冲区尾部 while num > 0 { idx -= 1; // 数字转对应ASCII码:'0'的ASCII是48,加上数字本身即可 buf[idx] = b'0' + (num % 10) as u8; num /= 10; } // 截取有效部分转为Vec,仅一次内存拷贝 buf[idx..].to_vec() } #[cfg(test)] mod tests { use super::*; #[test] fn usize_to_ascii_bytes_test() { assert_eq!(vec![53], usize_to_ascii_bytes(5)); assert_eq!(vec![53, 48], usize_to_ascii_bytes(50)); assert_eq!(vec![48], usize_to_ascii_bytes(0)); // 测试usize最大值 assert_eq!(b"18446744073709551615".to_vec(), usize_to_ascii_bytes(usize::MAX)); } }
实现优势
- 无动态扩容开销:使用固定大小的栈上数组作为缓冲区,避免了
Vec动态扩容带来的内存分配和拷贝成本。 - 直接数值计算:无需经过字符串格式化步骤,直接通过取模和除法计算每一位数字,再转换为对应ASCII码,减少中间环节。
- 最少拷贝:最终仅将缓冲区的有效部分一次性拷贝到
Vec中,内存操作最少。
对比简洁但低效的实现
如果追求代码简洁,可以用input.to_string().into_bytes(),但该方式会经历字符串格式化、内存分配等额外步骤,在高频调用场景(如Redis请求处理)中,性能远不如上述高效实现。
内容的提问来源于stack exchange,提问作者Philippe
相关产品推荐
相关产品推荐

