You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:27:20