如何在 WebAssembly 中将字符串写入内存
How to Write a String to Memory in WebAssembly
我是这样开始工作的:
// example.wast
(module
(memory (export "mem") 1))
// example.js
WebAssembly.instantiateStreaming(fetch('example.wasm'), {}).then(mod => {
var exports = mod.instance.exports
var i8 = new Uint8Array(exports.mem)
var ra = 100
var rb = 500
var rc = 1000
var rd = 1200
var re = 2000
exports.copy(0, ra)
exports.copy(ra, rb)
exports.copy(rb, rc)
exports.copy(rc, rd)
exports.copy(rd, re)
console.log(ra, getString(ra, i8))
console.log(rb, getString(rb, i8))
console.log(rc, getString(rc, i8))
console.log(rd, getString(rd, i8))
console.log(re, getString(re, i8))
})
function getString(index, buffer) {
var s = ''
for (var i = index; i < index + size; i++) {
s += String.fromCharCode(buffer[i])
}
return s
}
但是为了实现那个copy
功能,我首先需要加载字符串到WebAssembly内存中。想知道我是怎么做到的(尽可能少地使用 JS,主要使用 WebAssembly)。想知道你是否可以这样做:
exports.loadString(index, 'Hello World', i8)
否则,您必须改为执行以下操作:
function loadString(index, string, buffer) {
for (var i = 0, n = string.length; i < n; i++) {
buffer[index + i] = string[i]
}
}
或者更好:
function loadString(index, string, buffer) {
for (var i = 0, n = string.length; i < n; i++) {
exports.loadChar(index + i, string[i])
}
}
想知道如何在 WebAssembly 中执行此操作 exports.loadChar
或 exports.loadString
,它将字符串加载到内存中的特定位置。
我想避免使用 JS,即 buffer[index + i] = string[i]
。也许有一种方法可以动态加载到 data
段,这将允许 exports.loadString
.
WebAssembly 本身没有任何用于读取/写入线性内存的实用函数,因此没有导出的 exports.loadString
函数。
WebAssembly 导出对线性内存本身的引用,您可以将其作为类型化数组读取/写入。您已经在此处获得了对它的引用:
var i8 = new Uint8Array(exports.mem)
这将创建一个字节数组,允许您读取/写入从您的模块导出的名为 mem
的线性内存。您需要对字符串进行编码并将其写入此数组:
var encoder = new TextEncoder();
var encodedString = encoder.encode(str);
var i8 = new Uint8Array(exports.mem)
// Copy the UTF-8 encoded string into the WASM memory.
i8.set(encodedString);
我是这样开始工作的:
// example.wast
(module
(memory (export "mem") 1))
// example.js
WebAssembly.instantiateStreaming(fetch('example.wasm'), {}).then(mod => {
var exports = mod.instance.exports
var i8 = new Uint8Array(exports.mem)
var ra = 100
var rb = 500
var rc = 1000
var rd = 1200
var re = 2000
exports.copy(0, ra)
exports.copy(ra, rb)
exports.copy(rb, rc)
exports.copy(rc, rd)
exports.copy(rd, re)
console.log(ra, getString(ra, i8))
console.log(rb, getString(rb, i8))
console.log(rc, getString(rc, i8))
console.log(rd, getString(rd, i8))
console.log(re, getString(re, i8))
})
function getString(index, buffer) {
var s = ''
for (var i = index; i < index + size; i++) {
s += String.fromCharCode(buffer[i])
}
return s
}
但是为了实现那个copy
功能,我首先需要加载字符串到WebAssembly内存中。想知道我是怎么做到的(尽可能少地使用 JS,主要使用 WebAssembly)。想知道你是否可以这样做:
exports.loadString(index, 'Hello World', i8)
否则,您必须改为执行以下操作:
function loadString(index, string, buffer) {
for (var i = 0, n = string.length; i < n; i++) {
buffer[index + i] = string[i]
}
}
或者更好:
function loadString(index, string, buffer) {
for (var i = 0, n = string.length; i < n; i++) {
exports.loadChar(index + i, string[i])
}
}
想知道如何在 WebAssembly 中执行此操作 exports.loadChar
或 exports.loadString
,它将字符串加载到内存中的特定位置。
我想避免使用 JS,即 buffer[index + i] = string[i]
。也许有一种方法可以动态加载到 data
段,这将允许 exports.loadString
.
WebAssembly 本身没有任何用于读取/写入线性内存的实用函数,因此没有导出的 exports.loadString
函数。
WebAssembly 导出对线性内存本身的引用,您可以将其作为类型化数组读取/写入。您已经在此处获得了对它的引用:
var i8 = new Uint8Array(exports.mem)
这将创建一个字节数组,允许您读取/写入从您的模块导出的名为 mem
的线性内存。您需要对字符串进行编码并将其写入此数组:
var encoder = new TextEncoder();
var encodedString = encoder.encode(str);
var i8 = new Uint8Array(exports.mem)
// Copy the UTF-8 encoded string into the WASM memory.
i8.set(encodedString);