如果您的
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::from_utf8(rebuilt)
从中获取一个
String
- 这可能会返回一个错误。
match String::from_utf8(rebuilt) {
Ok(path) => Ok(path),
Err(e) => Err(format!("Invalid UTF-8 sequence: {}", e)),
}
read_to_string
的解决方案可以解决您的真正问题。 - Shepmaster