栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何从WebAssembly函数返回JavaScript字符串

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何从WebAssembly函数返回JavaScript字符串

WebAssembly本身不支持字符串类型,它,而支撑件

i32
/
i64
/
f32
/
f64
值类型以及
i8
/
i16
用于存储。

这取决于您要执行的操作,但似乎直接访问缓冲区是最简单的:

const bin = ...; // WebAssembly binary, I assume below that it imports a memory from module "imports", field "memory".const module = new WebAssembly.Module(bin);const memory = new WebAssembly.Memory({ initial: 2 }); // Size is in pages.const instance = new WebAssembly.Instance(module, { imports: { memory: memory } });const arrayBuffer = memory.buffer;const buffer = new Uint8Array(arrayBuffer);

如果您的模块具有

start
功能,那么它将在实例化时执行。否则,您可能会调用一个导出,例如
instance.exports.doIt()

完成后,您需要获取字符串大小+内存中的索引,还可以通过导出将其公开:

const size = instance.exports.myStringSize();const index = instance.exports.myStringIndex();

然后,您将从缓冲区中读取它:

let s = "";for (let i = index; i < index + size; ++i)  s += String.fromCharCode(buffer[i]);

请注意,我正在从缓冲区读取8位值,因此我假设字符串是ASCII。那就是

std::string
给你的东西(内存中的索引就是
.c_str()
返回的东西),但是要暴露其他东西(例如UTF-8),您需要使用支持UTF-8的C++库,然后自己从Javascript中读取UTF-8,获得代码点,然后使用
String.fromCodePoint

您还可以依靠以null终止的字符串,我在这里没有这样做。

您也可以使用

TextDeprer
API,一旦它获得更广泛的浏览器中创建一个
ArrayBufferView
WebAssembly.Memory
buffer
(这是
ArrayBuffer
)。


相反,如果您正在执行从WebAssembly到Javascript的登录等操作,则可以公开

Memory
上述内容,然后从WebAssembly声明一个导入,该导入以size+ position调用Javascript。您可以将模块实例化为:

const memory = new WebAssembly.Memory({ initial: 2 });const arrayBuffer = memory.buffer;const buffer = new Uint8Array(arrayBuffer);const instance = new WebAssembly.Instance(module, {    imports: {        memory: memory,        logString: (size, index) => { let s = ""; for (let i = index; i < index + size; ++i)     s += String.fromCharCode(buffer[i]); console.log(s);        }    }});

需要注意的是,如果您增加了内存(通过使用Javascript的Javascript

Memory.prototype.grow
或使用
grow_memory
操作码),则内存将
ArrayBuffer
被清除,您需要重新创建内存。


垃圾收集器:

WebAssembly.Module
/
WebAssembly.Instance
/
WebAssembly.Memory
是由Javascript引擎收集到的所有垃圾,但是这是一个相当大的锤子。您可能希望使用GC字符串,而对于位于中的对象,目前尚无法实现
WebAssembly.Memory



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/400565.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号