我想要一个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来完成此工作?
答案 0 :(得分:2)
您不能直接导入它,并且发布的代码是正确的方法。 WASM无法直接在其内存外部接触JS缓冲区。出于安全原因,将WASM放到沙箱中以保护主机环境(JS)。
您也许可以提高copy_into
的速度。您可以在JS端编写复制操作,而不是在Rust端浏览缓冲区。特别是对于大缓冲区,这将更快,因为JS会在内部执行块复制操作。