バイトのベクトル(RustでVec<u8>
)を生成し、Array
またはUint8Array
としてJSにアクセスして、WebSocketまたはIndexedDBに送信したいとします。RustからJavaScriptを使って配列をEmscriptenにコンパイルする
私は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
最初問題は、値は空の配列を表し、2番目の呼び出しは同じメモリ位置を指しています。私は、ベクトルの長さとともに、ヒープ上のポイント先のデータへのアクセス方法を全く考えていません。
寿命が終わると(bytes
の終わり)、RustがVec<u8>
の書き込みを破棄するため、2つのポインタが同じメモリ位置を指している可能性があります。
申し訳ありませんがWasmとEmscriptenのいくつかの基本を逃した場合、私は今日初めて私のWasmの世界を構築しました。
私はWasmのJavascript側に慣れていませんし、錆もそれほどありませんが、ここではあまりにも多くのエキスパートがいらっしゃいません。あなたを軌道に乗せるかもしれないいくつかのアイデアがあります:1.あなたは錆びているアレイを作成する必要がありますか? Javascript配列を(変更可能な)錆の参照として渡し、そこで変更することが可能です。 2. C/C++でこれを行う方法の詳細は、錆の中でどのように行うのかを知っているかもしれません。 – kazemakase