有没有办法从 WebAssembly 上下文写入 JavaScript 缓冲区?
Is there a way to write to a JavaScript Buffer from the WebAssembly context?
我想要一个 WebAssembly 函数(从 Rust 编译),它以 JavaScript Buffer
作为参数并将数据写入缓冲区。然后我希望能够使用此缓冲区并与来自 JavaScript 上下文的数据进行交互。
我正在使用 wasm-bindgen 将 WebAssembly 结构导出到 JavaScript,但我不知道如何在 WebAssembly 中使用 JavaScript Buffer
。
这是我希望 Rust 源代码看起来像的简化版本:
struct Element {
a: u8,
b: String,
}
impl Element {
fn new(a: u8, b: &str) -> Element {
Element {
a: a,
b: String::from(b),
}
}
fn copy_into(&self, buffer: Buffer) {
let mut offset = 0;
buffer[offset] = self.a;
offset += std::mem::size_of::<u8>();
buffer[offset] = self.b;
}
}
这就是我想在 JavaScript 上下文中做的事情:
// Code for importing Element and instantiating the wasm module omitted.
let element = new Element(1, 'abc');
let buffer = Buffer.allocUnsafe(4);
element.copy_into(buffer);
console.log(buffer.toString('hex'));
我希望上面代码末尾的 console.log
将“01616263”打印到控制台。我想实现这一点,而不必在 WebAssembly 中分配新内存并复制内容。相反,我想直接写入 JavaScript 内存,其中 buffer
是指向该内存的指针。
如何通过某种方式将 Buffer
导入 Rust 来完成此操作?
您不能直接导入它,您发布的代码是正确的导入方法。 WASM 无法直接接触其内存之外的 JS 缓冲区。出于安全原因,这就是 WASM 沙盒化的方式,以保护主机环境 (JS)。
您或许可以提高 copy_into
的速度。您可以在 JS 端编写复制操作,而不是在 Rust 端遍历缓冲区。这将更快,尤其是对于大缓冲区,因为 JS 将在内部执行块复制操作。
我想要一个 WebAssembly 函数(从 Rust 编译),它以 JavaScript Buffer
作为参数并将数据写入缓冲区。然后我希望能够使用此缓冲区并与来自 JavaScript 上下文的数据进行交互。
我正在使用 wasm-bindgen 将 WebAssembly 结构导出到 JavaScript,但我不知道如何在 WebAssembly 中使用 JavaScript Buffer
。
这是我希望 Rust 源代码看起来像的简化版本:
struct Element {
a: u8,
b: String,
}
impl Element {
fn new(a: u8, b: &str) -> Element {
Element {
a: a,
b: String::from(b),
}
}
fn copy_into(&self, buffer: Buffer) {
let mut offset = 0;
buffer[offset] = self.a;
offset += std::mem::size_of::<u8>();
buffer[offset] = self.b;
}
}
这就是我想在 JavaScript 上下文中做的事情:
// Code for importing Element and instantiating the wasm module omitted.
let element = new Element(1, 'abc');
let buffer = Buffer.allocUnsafe(4);
element.copy_into(buffer);
console.log(buffer.toString('hex'));
我希望上面代码末尾的 console.log
将“01616263”打印到控制台。我想实现这一点,而不必在 WebAssembly 中分配新内存并复制内容。相反,我想直接写入 JavaScript 内存,其中 buffer
是指向该内存的指针。
如何通过某种方式将 Buffer
导入 Rust 来完成此操作?
您不能直接导入它,您发布的代码是正确的导入方法。 WASM 无法直接接触其内存之外的 JS 缓冲区。出于安全原因,这就是 WASM 沙盒化的方式,以保护主机环境 (JS)。
您或许可以提高 copy_into
的速度。您可以在 JS 端编写复制操作,而不是在 Rust 端遍历缓冲区。这将更快,尤其是对于大缓冲区,因为 JS 将在内部执行块复制操作。