在 WebAssembly 实例中将嵌入文件读取为 Uint8Array

Posted

技术标签:

【中文标题】在 WebAssembly 实例中将嵌入文件读取为 Uint8Array【英文标题】:Read embedded file as Uint8Array in WebAssembly instance 【发布时间】:2020-05-04 21:32:35 【问题描述】:

我在 WebAssembly wasm 文件中嵌入了一个二进制文件。

考虑这个来源:

embed.ts(使用 AssemblyScript 构建为 embed.wasm):

export const text: u8[] = [83,65,77,80,76,69,10]; // The text "SAMPLE" in UTF-8 encoding

export const textLength: i32 = text.length;

worker.js:

const instance = new WebAssembly.Instance(/* read embed.wasm */).exports;
instance.textLength // prints 7, correct
instance.text // prints, 10232 of type number, ?!?!?

我怎样才能读出这个字节数组来重建嵌入的文件?我需要重新创建 Uint8Array,以便在 worker.js 中保存文件或将其流式传输到某处。

【问题讨论】:

【参考方案1】:

当前阶段的WebAssembly 只能在wasm 模块和javascript 主机之间传递数字,因此instance.text 只是数字(指针)或线性内存中的偏移量。为了从该内存中读取真实数据,您可以使用loader 中的__getUint8Array__getArray。还有useful info

【讨论】:

Bingo 感谢@MaxGraey 为我指明了方向,我使用了已加载的文件并完美地提取了文件。

以上是关于在 WebAssembly 实例中将嵌入文件读取为 Uint8Array的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Blazor WebAssembly 中将 Json 结果转换为字符串?

如何在 GitLab Pages 中将 Blazor WebAssembly 部署为静态站点

如何在 Go 语言开发的宿主程序中嵌入 WebAssembly

WebAssembly在软件生态系统中将继续发挥更大的作用

WebAssembly在软件生态系统中将继续发挥更大的作用

在 Rust 程序和嵌入式 WebAssembly 运行时之间进行通信的最佳实践是啥?