WebAssembly 加密解密时内存数据怎么正确传递?

Designer°英杰 阅读 32

我用 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>
我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
UI文雅
UI文雅 Lv1
问题是你传的是 Uint8Array 对象本身,而不是 wasm 内存地址。Rust 函数需要的是指针(内存偏移量),不是 JS 的 TypedArray。

正确的做法是先把数据写入 wasm 内存,再把指针传给 Rust:

JS 端需要这样写:

const input = 'hello';
const encoder = new TextEncoder();
const data = encoder.encode(input);

// 先在 wasm 内存中分配空间
const ptr = wasmMemory.exports.alloc(data.length);
// 把数据拷贝到 wasm 内存
new Uint8Array(wasmMemory.exports.memory.buffer).set(data, ptr);

// 传指针和长度给 Rust
const resultPtr = encrypt(ptr, data.length);


Rust 端函数签名改成接收指针和长度:

#[wasm_bindgen]
pub fn encrypt(data: *const u8, len: usize) -> *mut u8 {
let input = unsafe { std::slice::from_raw_parts(data, len) };
// 你的加密逻辑
}


核心就一点:wasm 只能通过内存指针传数据,TypedArray 对象得先拷贝进去。
点赞
2026-03-16 15:00