这是我的密码:
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的向量。
发布于 2015-01-24 09:54:18
如果您查看文档,可以使用以下几种方法。有String::from_utf8,有Vec<u8>,也有String::from_utf8_lossy,有&[u8]。
请注意,Vec<T>或多或少是[T]的一个拥有的、可调整大小的包装器。也就是说,如果您有一个Vec<u8>,您可以将它转换为一个&[u8],最容易的方法是重新借用它(即&*some_vec)。您还可以直接在&[T]上调用在Vec<T>上定义的任何方法(通常,实现Deref特性的事情就是这样)。
发布于 2016-08-16 12:24:53
如果您的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。
当我运行它时,输出是:
返回一个49字节字符串。 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从其中获得一个String::from_utf8(rebuilt) --这可能会返回一个错误。
match String::from_utf8(rebuilt) {
Ok(path) => Ok(path),
Err(e) => Err(format!("Invalid UTF-8 sequence: {}", e)),
}发布于 2020-09-04 03:33:30
若要以UTF-8字符串形式打印字节,请在字节可能格式错误时使用std::str::from_utf8。当字节总是有效的UTF-8时使用不安全的std::str::from_utf8_unchecked。
println!("{}", std::str::from_utf8(&altbuf).unwrap());https://stackoverflow.com/questions/28123923
复制相似问题