如何打印u8的矢量作为字符串?

AAn*_*son 8 rust

这是我的代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

代码打印u8字节是正确的,但我无法弄清楚如何将纯u8字节的矢量转换为字符串?对堆栈溢出的类似问题的唯一其他答案假定您正在使用类型为&[u8]的向量.

DK.*_*DK. 12

如果查看String文档,可以使用一些方法.还有String::from_utf8,需要一个Vec<u8>,还有还有String::from_utf8_lossy,这需要&[u8].

请注意,a Vec<T>或多或少是一个拥有的,可调整大小的包装器[T].也就是说,如果你有一个Vec<u8>,你可以把它变成一个&[u8],最容易通过重新借用它( &*some_vec).您也可以&[T]直接调用在a 上定义的任何方法Vec<T>(通常,实现Deref特征的事情也是如此).


And*_*zie 6

如果你的altbuf向量u8如图所示,这应该有效:

println!("{:?}", altbuf);
Run Code Online (Sandbox Code Playgroud)

这是我编辑的一段代码,它执行类似的操作:

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);
Run Code Online (Sandbox Code Playgroud)

它从由通过 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使用 - 从中​​获取 a String::from_utf8(rebuilt),这可能会返回错误。

match String::from_utf8(rebuilt) {
    Ok(path) => Ok(path),
    Err(e) => Err(format!("Invalid UTF-8 sequence: {}", e)),
}
Run Code Online (Sandbox Code Playgroud)