我想生成一个向量字节(Vec<u8>
Rust),并用JS作为Array
或Uint8Array
访问它,并将它发送到WebSocket或IndexedDB。从Rust编译成Emscripten在JavaScript中获得一个数组
我发现How can I pass an array from JavaScript to Rust that has been compiled with Emscripten?,这与我想要做的完全相反,但非常相关。除此之外,我知道Emscripten中的数组类型,但我不知道如何正确使用它。
我如何得到这个工作的最佳猜测是尝试返回矢量as_mut_ptr
,并使用Module.HEAPU8
上的指针。
main.rs
#[no_mangle]
pub fn bytes() -> *mut u8 {
vec![1, 2, 3].as_mut_ptr()
}
fn main() {}
部分的index.html
var Module = {
wasmBinaryFile: "site.wasm",
onRuntimeInitialized: main,
};
function main() {
let ptr = Module._bytes();
console.log(ptr);
console.log(Module.HEAPU8.slice(ptr, ptr + 10));
console.log(Module.HEAPU8.subarray(ptr, ptr + 100));
let arr = Module.cwrap('bytes', 'array', []);
console.log(arr());
}
结束了控制台看起来像这样的结果:
5260296 site:11:13
Uint8Array [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] site:12:13
Uint8Array [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90 more… ] site:13:13
5260296 site:15:13
第一问题在于两者值表示空数组,其次这两个单独的调用指向相同的内存位置。我完全不知道如何访问堆中的指向数据以及向量的长度。
指向同一内存位置的两个指针可能是因为Rust在生命周期结束时(bytes
的末尾)写入Vec<u8>
函数。
对不起,如果我错过了Wasm和Emscripten的一些基本知识,我今天只建立了我的第一个Wasm hello world。
我对Wasm的Javascript方面并不熟悉,也不太熟悉生锈,但恐怕在这里也没有太多的专家。以下是一些可能会让你走上正轨的想法:1.你需要创建一个防锈的阵列吗?它可能会传递一个Javascript数组作为(可变)引用来生锈并在那里修改它。 2.您可以在C/C++中找到更多信息,这可能会让您知道如何在C/C++中执行相同操作。 – kazemakase