WebAssembly 加密解密时内存数据怎么正确传递?
我用 Rust 编译了一个 WebAssembly 模块,里面有个加密函数,接收一个字符串并返回加密后的字节数组。但在 JS 里调用时,传进去的字符串好像没正确传到 wasm 里,返回的结果也不对。我试过用 TextEncoder 编码,但 wasm 内部读出来是乱码或者空的。
这是我在 HTML 里调用的代码:
<script type="module">
import init, { encrypt } from './pkg/wasm_crypto.js';
await init();
const input = new TextEncoder().encode('hello');
const ptr = encrypt(input, input.length);
// 后续用 ptr 读取结果,但内容不对
</script>
正确的做法是先把数据写入 wasm 内存,再把指针传给 Rust:
JS 端需要这样写:
Rust 端函数签名改成接收指针和长度:
核心就一点:wasm 只能通过内存指针传数据,TypedArray 对象得先拷贝进去。