rust - 在没有 std 的情况下将 *mut u8 转换为 &[u8]

标签 rust webassembly

我正在为 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/

相关文章:

c# - WebAssembly 的 UNO 框架中的 WebView 需要解决方法

rust - 将 Option<Box<[Box<[JsValue]>]>> 从 Rust fn 返回到 Wasm 的替代方法

string - 如何将 "Hello World"加载到 WebAssembly 中的 `.data` 部分

rust - 由于需求冲突,无法为生命周期参数 `' de` 推断出合适的生命周期

rust - 我们什么时候应该在 Rust 中使用 unwrap 和 expect

rust - 如何处理 Option<Ref<T>> 和 Option<&T>

rust - 在使用 wasm-bindgen 时,如何解决无法导出具有生命周期的函数的问题?

winapi - 这是使用 Windows API "safe"的 Rust 代码吗?

rust - Rc 中用于 AST 操作的沮丧特征

javascript - 试图了解如何通过 webpack 导入 web-assembly 包