【问题标题】:Is there a way to write to a JavaScript Buffer from the WebAssembly context?有没有办法从 WebAssembly 上下文写入 JavaScript 缓冲区?
【发布时间】:2019-11-09 10:51:58
【问题描述】:

我想要一个 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 来实现这一点?

【问题讨论】:

    标签: javascript rust webassembly


    【解决方案1】:

    不能直接导入,贴出的代码才是正确的做法。 WASM 不能直接接触其内存之外的 JS 缓冲区。出于安全原因,这就是 WASM 沙盒化的方式,以保护主机环境 (JS)。

    您也许可以提高copy_into 的速度。您可以在 JS 端编写复制操作,而不是在 Rust 端遍历缓冲区。这会更快,尤其是对于大缓冲区,因为 JS 将在内部执行块复制操作。

    【讨论】:

    • 你写的代码是正确的方法。这是否意味着我实际上可以将 JS 缓冲区作为参数并按照我描述的方式写入它?如果是这样,那是不是意味着它会直接从 Wasm 写入 JS 内存?你到底是什么意思我可以加快copy_into?您是否建议我不将缓冲区作为参数,而是简单地将 Wasm 中的值返回到一个数组中,然后我将其复制到 JS 端的缓冲区中?
    猜你喜欢
    • 2013-02-09
    • 2023-03-08
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多