我想生成一個向量字節(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