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

Rust中如何将CRLF分隔的ASCII数字序列转为整数数组?

问题:将ASCII数字字符向量转换为整数数组

给定存储ASCII数字字符的向量m,数字字符的ASCII码范围为48-57(对应0-9),数字序列以连续的13、10(即CRLF)作为分隔符。需要实现Rust代码逻辑,将示例向量转换为目标整数数组[1073, 8705]。

原代码示例:

fn main() {
  let m: Vec<u8> = vec![49, 48, 55, 51, 13, 10, 56, 55, 48, 53, 13, 10];
  let mut n: Vec<u32> = vec![];

  println!("m = {:?}", m);
  println!("n = {:?}", n);

  //  ...
  
  println!("n = {:?}", n); // 期望输出: [1073, 8705]
}

/*
0 - 48
1 - 49
2 - 50
3 - 51
4 - 52
5 - 53
6 - 54
7 - 55
8 - 56
9 - 57
*/
解决方案

这里提供两种实现方式,分别适配不同场景需求:

方式一:手动遍历字节(精细控制场景)

核心逻辑是逐个遍历字节,拼接数字字符,遇到CRLF分隔符时完成整数转换:

fn main() {
  let m: Vec<u8> = vec![49, 48, 55, 51, 13, 10, 56, 55, 48, 53, 13, 10];
  let mut n: Vec<u32> = vec![];
  let mut current_num_str = String::new();

  println!("m = {:?}", m);
  println!("n = {:?}", n);

  // 使用peekable迭代器,方便检查下一个字节是否为LF
  let mut iter = m.iter().peekable();
  while let Some(&byte) = iter.next() {
    match byte {
      // 数字字符转为char,拼接到当前字符串
      48..=57 => current_num_str.push(byte as char),
      // 遇到CR时,检查后续是否为LF
      13 => {
        if let Some(&&10) = iter.peek() {
          // 转换当前拼接的数字字符串并加入结果
          if !current_num_str.is_empty() {
            if let Ok(num) = current_num_str.parse::<u32>() {
              n.push(num);
            }
            current_num_str.clear();
          }
          // 跳过LF字节
          iter.next();
        }
      }
      // 忽略未知字符(可选逻辑)
      _ => {}
    }
  }

  // 处理向量末尾未被分隔符终止的数字片段
  if !current_num_str.is_empty() {
    if let Ok(num) = current_num_str.parse::<u32>() {
      n.push(num);
    }
  }
  
  println!("n = {:?}", n); // 输出: [1073, 8705]
}

方式二:利用字符串分割(简洁高效场景)

借助Rust的字符串处理API,将字节向量转为字符串后直接按CRLF分割,再批量转换为整数:

fn main() {
  let m: Vec<u8> = vec![49, 48, 55, 51, 13, 10, 56, 55, 48, 53, 13, 10];
  let mut n: Vec<u32> = vec![];

  println!("m = {:?}", m);
  println!("n = {:?}", n);

  // 字节转字符串,按CRLF分割后过滤空值、转换为整数
  if let Ok(s) = String::from_utf8(m) {
    n = s.split("\r\n")
        .filter(|s| !s.is_empty()) // 过滤末尾CRLF产生的空字符串
        .filter_map(|s| s.parse::<u32>().ok()) // 转换为u32,自动忽略转换失败的情况
        .collect();
  }
  
  println!("n = {:?}", n); // 输出: [1073, 8705]
}

代码说明

  • 方式一适合需要对字节处理做精细控制的场景,比如需要处理异常字节、自定义分隔符逻辑等
  • 方式二代码更简洁,利用Rust迭代器的链式调用完成转换,适合常规的字符串分割转换需求

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:17:07