0

查看函数签名js_sys::Uint8Array::new_with_byte_offset_and_length

pub fn new_with_byte_offset_and_length(
    buffer: &JsValue,
    byte_offset: u32,
    length: u32
) -> Uint8Array

它需要一个buffer引用当前 wasm 实例的内存缓冲区的参数。

如何从 Rust 端访问这样的对象?(被编译成 wasm)

4

1 回答 1

3

它需要一个引用当前 wasm 实例的内存缓冲区的参数缓冲区。

首先,值得注意的是,这不一定是真的。该绑定适用于标准 JavaScript API——Uint8Array它允许您从任意缓冲区或容量创建字节数组。

如果您只想将字节数组视图传递给 Rust 内存或将 Rust 内存中的字节返回给 JavaScript,那么您实际上并不需要此构造函数 - 为此,请使用wasm-bindgen's 标准功能并传递/返回&[u8]Vec<u8>像常规那样锈代码。

但是,为了以防万一,回答您问题的第二部分

如何从 Rust 端访问这样的对象?(编译为 wasm)

从 Rust 方面,您可以使用wasm_bindgen::memory,这将为您提供一个内存实例。默认情况下,它以 generic 的形式返回它JsValue,但您可以将其转换为WebAssembly.Memoryusing .unchecked_into::<js_sys::WebAssembly::Memory>(),这反过来又可以让您在buffer需要时访问该属性。

请注意,像这样为 Rust 内存创建短期Uint8Array视图也是在内置 API 中实现的js_sys::Uint8Array::view,但它被标记unsafe有一个很好的理由:buffer可以在任何分配上失效,许多内置 API 调用,所以你需要非常小心地处理这些视图,并确保它们在创建后立即使用。再次,避免问题的最佳方法是完全不依赖这种低级访问,而是使用#[wasm_bindgen]来生成任何绑定。

于 2020-02-28T03:03:44.117 回答