我正在为 WebAssembly 编写 Rust 代码来处理来自 JavaScript 领域的字符串。
由于 WebAssembly 没有真正的字符串类型,我试图传递一个指向指向 UTF-8 编码字符串的 WebAssembly 内存对象的指针。
#[no_mangle]
pub extern "C" fn check(ptr: *mut u8, length: u32) -> u32 {
unsafe {
let buf: &[u8] = std::slice::from_raw_parts(ptr, length as usize);
// do some operations on buf
0
}
}
它工作正常,预计我必须依赖于 std
crate,它将最终二进制文件膨胀到大约 600KB。
有什么方法可以摆脱 std::slice::from_raw_parts
但仍然能够将原始指针转换为切片?
最佳答案
您不能将原始指针转换为切片,因为在 Rust 中,切片不仅仅是一个指针,它是一个指针和一个大小(否则它就不安全)。
如果你不想使用std
,你可以使用core
crate :
extern crate core;
#[no_mangle]
pub extern "C" fn check(ptr: *mut u8, length: u32) -> u32 {
unsafe {
let buf: &mut [u8] = core::slice::from_raw_parts_mut(ptr, length as usize);
}
// do some operations on buf
0
}
core
crate是适合嵌入式的 std
crate 的一部分,即没有所有需要分配的东西。
关于rust - 在没有 std 的情况下将 *mut u8 转换为 &[u8],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50941427/