如何将 u8 的向量打印为字符串?
How do I print a vector of u8 as a string?
这是我的代码:
let mut altbuf: Vec<u8> = Vec::new();
// Stuff here...
match stream.read_byte() {
Ok(d) => altbuf.push(d),
Err(e) => { println!("Error: {}", e); doneflag = true; }
}
for x in altbuf.iter() {
println!("{}", x);
}
代码打印的 u8 字节是正确的,但我一直想不出如何将纯 u8 字节的向量转换为字符串?关于堆栈溢出的类似问题的唯一其他答案假设您正在使用 &[u8].
类型的向量
如果您查看 String
documentation, there are a few methods you could use. There's String::from_utf8
that takes a Vec<u8>
, and there's also String::from_utf8_lossy
,它需要一个 &[u8]
。
请注意,Vec<T>
或多或少是 [T]
的一个拥有的、可调整大小的包装器。也就是说,如果你有一个Vec<u8>
,你可以把它变成一个&[u8]
,最简单的方法是重新借用它(即 &*some_vec
) .您还可以直接在 Vec<T>
上调用在 &[T]
上定义的任何方法(一般来说,实现 Deref
特性的事物都是如此)。
如果您的 altbuf
是 u8
的矢量,如图所示,这应该有效:
println!("{:?}", altbuf);
这是我拥有的一段经过编辑的代码,它执行类似的操作:
let rebuilt: Vec<u8>;
unsafe {
ret = proc_pidpath(pid, buffer_ptr, buffer_size);
rebuilt = Vec::from_raw_parts(buffer_ptr as *mut u8, ret as usize, buffer_size as usize);
};
println!("Returned a {} byte string", ret);
println!("{:?}", rebuilt);
从通过 FFI 调用的 C 函数填充的缓冲区中重建 u8
值的向量,因此字节可以是任何内容,可能不是有效的 UTF-8。
当我运行它时,输出是:
Returned a 49 byte string
[47, 85, 115, 101, 114, 115, 47, 97, 110,
100, 114, 101, 119, 47, 46, 114, 98, 101, 110, 118, 47, 118, 101, 114,
115, 105, 111, 110, 115, 47, 49, 46, 57, 46, 51, 45, 112, 51, 57, 50,
47, 98, 105, 110, 47, 114, 117, 98, 121]
您可以使用 {}
.
中的 different format strings 格式化打印的数字(十六进制、八进制等)
您可以使用 String::from_utf8(rebuilt)
从中得到 String
- 这可能会 return 出错。
match String::from_utf8(rebuilt) {
Ok(path) => Ok(path),
Err(e) => Err(format!("Invalid UTF-8 sequence: {}", e)),
}
要将字节打印为 UTF-8 字符串,请在字节始终为有效 UTF-8 时使用 std::str::from_utf8
when the bytes may be malformed. Use the unsafe std::str::from_utf8_unchecked
。
println!("{}", std::str::from_utf8(&altbuf).unwrap());
使用 std::io
中的 write
方法:
use std::{io, io::Write};
fn main() -> io::Result<()> {
io::stdout().write(b"March\n")?;
Ok(())
}
它打印一片 u8
,也称为字节串。
这是我的代码:
let mut altbuf: Vec<u8> = Vec::new();
// Stuff here...
match stream.read_byte() {
Ok(d) => altbuf.push(d),
Err(e) => { println!("Error: {}", e); doneflag = true; }
}
for x in altbuf.iter() {
println!("{}", x);
}
代码打印的 u8 字节是正确的,但我一直想不出如何将纯 u8 字节的向量转换为字符串?关于堆栈溢出的类似问题的唯一其他答案假设您正在使用 &[u8].
类型的向量如果您查看 String
documentation, there are a few methods you could use. There's String::from_utf8
that takes a Vec<u8>
, and there's also String::from_utf8_lossy
,它需要一个 &[u8]
。
请注意,Vec<T>
或多或少是 [T]
的一个拥有的、可调整大小的包装器。也就是说,如果你有一个Vec<u8>
,你可以把它变成一个&[u8]
,最简单的方法是重新借用它(即 &*some_vec
) .您还可以直接在 Vec<T>
上调用在 &[T]
上定义的任何方法(一般来说,实现 Deref
特性的事物都是如此)。
如果您的 altbuf
是 u8
的矢量,如图所示,这应该有效:
println!("{:?}", altbuf);
这是我拥有的一段经过编辑的代码,它执行类似的操作:
let rebuilt: Vec<u8>;
unsafe {
ret = proc_pidpath(pid, buffer_ptr, buffer_size);
rebuilt = Vec::from_raw_parts(buffer_ptr as *mut u8, ret as usize, buffer_size as usize);
};
println!("Returned a {} byte string", ret);
println!("{:?}", rebuilt);
从通过 FFI 调用的 C 函数填充的缓冲区中重建 u8
值的向量,因此字节可以是任何内容,可能不是有效的 UTF-8。
当我运行它时,输出是:
Returned a 49 byte string
[47, 85, 115, 101, 114, 115, 47, 97, 110, 100, 114, 101, 119, 47, 46, 114, 98, 101, 110, 118, 47, 118, 101, 114, 115, 105, 111, 110, 115, 47, 49, 46, 57, 46, 51, 45, 112, 51, 57, 50, 47, 98, 105, 110, 47, 114, 117, 98, 121]
您可以使用 {}
.
您可以使用 String::from_utf8(rebuilt)
从中得到 String
- 这可能会 return 出错。
match String::from_utf8(rebuilt) {
Ok(path) => Ok(path),
Err(e) => Err(format!("Invalid UTF-8 sequence: {}", e)),
}
要将字节打印为 UTF-8 字符串,请在字节始终为有效 UTF-8 时使用 std::str::from_utf8
when the bytes may be malformed. Use the unsafe std::str::from_utf8_unchecked
。
println!("{}", std::str::from_utf8(&altbuf).unwrap());
使用 std::io
中的 write
方法:
use std::{io, io::Write};
fn main() -> io::Result<()> {
io::stdout().write(b"March\n")?;
Ok(())
}
它打印一片 u8
,也称为字节串。