[WASM] Write to WebAssembly Memory from JavaScript
We write a function that converts a string to lowercase in WebAssembly, demonstrating how to set the input string from JavaScript.
WASM Fiddle: https://wasdk.github.io/WasmFiddle/?h1s69
Demo Repo: https://github.com/guybedford/wasm-intro
We want to create a funcrtion 'toLowerCase', which enable JS to write in Memory.
To write data into WASM, we need to variables in C code, one is 'inStr' which get original input (for example 'Hello World'), another is 'outStr' which will transform to lower case string (for example: 'hello world').
C code:
void consoleLog (char* offset, int len); char inStr[20]; char outStr[20]; char* getInStrOffset () { return &inStr[0]; } void toLowerCase() { for (int i = 0; i < 20; i++ ) { char c = inStr[i]; if (c > 64 && c < 91) { c = c + 32; } outStr[i] = c; } consoleLog(&outStr[0], 20); }
JS: Some code to get wasm instance.
var wasmModule = new WebAssembly.Module(wasmCode); var wasmInstance = new WebAssembly.Instance(wasmModule, { env: { consoleLog (offset, len) { const strBuf = new Uint8Array(mem.buffer, offset, len); log(new TextDecoder().decode(strBuf)); } } }); const mem = wasmInstance.exports.memory;
Now we need to write data from JS to WASM memory, the way to do it is just to put data into 'inStr':
const mem = wasmInstance.exports.memory; function writeString (str, offset) { const strBuf = new TextEncoder().encode(str); const outBuf = new Uint8Array(mem.buffer, offset, strBuf.length); for (let i = 0; i < strBuf.length; i++) { outBuf[i] = strBuf[i]; } } } writeString('Hello Web Assembly', wasmInstance.exports.getInStrOffset());
Because what 'wasmInstance.exports.getInStrOffset()' return us is the first char address of 'inStr', then we use for loop to write data into 'inStr'.
After writting the data, then we can call 'toLowerCase' to see the result:
var wasmModule = new WebAssembly.Module(wasmCode); var wasmInstance = new WebAssembly.Instance(wasmModule, { env: { consoleLog (offset, len) { const strBuf = new Uint8Array(mem.buffer, offset, len); log(new TextDecoder().decode(strBuf)); } } }); const mem = wasmInstance.exports.memory; function writeString (str, offset) { const strBuf = new TextEncoder().encode(str); const outBuf = new Uint8Array(mem.buffer, offset, strBuf.length); for (let i = 0; i < strBuf.length; i++) { outBuf[i] = strBuf[i]; } } } writeString('Hello Web Assembly', wasmInstance.exports.getInStrOffset()); wasmInstance.exports.toLowerCase();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2015-06-30 [Javascript + rxjs] Simple drag and drop with Observables