在 Rust 中将 ascii 数组转换为字符串的惯用方法
Idiomatic way to convert ascii array to string in Rust
我想从字节数组中使用 ASCII 编码将切片转换为字符串。
解决方案
fn main() {
let buffer: [u8; 9] = [255, 255, 255, 255, 77, 80, 81, 82, 83];
let s = String::from_iter(buffer[5..9].iter().map(|v| { *v as char }));
println!("{}", s);
assert_eq!("PQRS", s);
}
似乎不是地道的,而且有一种性能不佳的味道。
我们能做得更好吗?
没有外部板条箱?
可以像这样从 UTF-8 编码字节缓冲区直接创建 Rust 字符串:
fn main() {
let buffer: [u8; 9] = [255, 255, 255, 255, 77, 80, 81, 82, 83];
let s = std::str::from_utf8(&buffer[5..9]).expect("invalid utf-8 sequence");
println!("{}", s);
assert_eq!("PQRS", s);
}
如果输入缓冲区包含无效的 UTF-8 序列,操作可能会失败,但 ASCII 字符是有效的 UTF-8,因此在这种情况下它可以工作。
注意这里s
的类型是&str
,意思是它是对buffer
的引用。这里没有分配,所以运行效率很高。
查看实际效果:Playground link
我想从字节数组中使用 ASCII 编码将切片转换为字符串。 解决方案
fn main() {
let buffer: [u8; 9] = [255, 255, 255, 255, 77, 80, 81, 82, 83];
let s = String::from_iter(buffer[5..9].iter().map(|v| { *v as char }));
println!("{}", s);
assert_eq!("PQRS", s);
}
似乎不是地道的,而且有一种性能不佳的味道。 我们能做得更好吗? 没有外部板条箱?
可以像这样从 UTF-8 编码字节缓冲区直接创建 Rust 字符串:
fn main() {
let buffer: [u8; 9] = [255, 255, 255, 255, 77, 80, 81, 82, 83];
let s = std::str::from_utf8(&buffer[5..9]).expect("invalid utf-8 sequence");
println!("{}", s);
assert_eq!("PQRS", s);
}
如果输入缓冲区包含无效的 UTF-8 序列,操作可能会失败,但 ASCII 字符是有效的 UTF-8,因此在这种情况下它可以工作。
注意这里s
的类型是&str
,意思是它是对buffer
的引用。这里没有分配,所以运行效率很高。
查看实际效果:Playground link