[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();
复制代码

 

posted @   Zhentiw  阅读(683)  评论(0编辑  收藏  举报
编辑推荐:
· 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
点击右上角即可分享
微信分享提示