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
相关产品推荐
相关产品推荐

