【发布时间】:2016-06-18 12:42:00
【问题描述】:
我有一个Vec<u8>,其中包含由'\0' as u8 分隔的UTF-8 字符串。固定长度的二进制打包数据放在每个字符串之后,如下所示:
b"abc\0" 10_bytes_of_data b"ufhd\0" 10_bytes_data,
我想解析这样一个Vec<u8> 并填充一个Vec<&str>。为了简化事情,我将10_bytes_of_data 替换为0_bytes_of_data:
let cnt = b"abc\0efg\0";
let mut cnt_vec = Vec::<u8>::new();
for ch in cnt {
cnt_vec.push(*ch);
}
let mut str_start_it = cnt_vec.iter();
let mut strings = Vec::<&str>::new();
let mut cur_it = cnt_vec.iter();
let mut counter: usize = 0;
loop {
match cur_it.next() {
Some(ch) => {
if *ch == 0u8 {
{
let slice = str_start_it.as_slice();
let s = std::str::from_utf8(&slice[0..counter]).unwrap();
strings.push(s);
}
str_start_it = cur_it.clone();
counter = 0;
} else {
counter += 1;
}
}
None => {
break;
}
}
}
for s in strings {
println!("s {}", s);
}
我有几个问题:
有没有更简单的方法可以将
cnt转换为cnt_vec?是否可以用更少的代码行编写主算法?在现实世界中,字符串之间有 10 个字节;我打算用
Iterator::nth。我的代码中是否有任何不必要的堆分配?我只想在
cnt_vec和strings中进行堆分配,也许除了push之外的某些行在堆上分配内存?
【问题讨论】:
标签: rust