如何从 Wasm 内存缓冲区中读取元组结构?

Posted

技术标签:

【中文标题】如何从 Wasm 内存缓冲区中读取元组结构?【英文标题】:How do I read a tuple struct from a Wasm memory buffer? 【发布时间】:2020-11-25 14:14:44 【问题描述】:

我已经定义了一个元组结构:

pub struct ChangedCell(pub bool, pub u32, pub u32);

我的假设

ChangedCell 有 9 个字节(bool:1 个字节,u32:4 个字节,u32:4 个字节)

我做了什么

我将pointer, lengthVec<ChangedCell> 返回给javascript

const arr = new Uint8Array(memory.buffer, pointer, length * 9);
function getElements(n,arr) 

    const isVal = arr[n * 9 + 0];
    const val1 = arr.slice(n * 9 + 1, n * 9 + 5);
    const val2 = arr.slice(n * 9 + 5, n * 9 + 9);
    return isVal,val1,val2

预期行为

isVal 成为 valid [byte] val1 成为valid [byte] * 4 val2 成为 valid [byte] * 4

问题

I am getting Garbage values! 你如何将这样的内容读入 JavaScript?

【问题讨论】:

为了帮助人们回答您的问题,您应该包含一个minimal, reproducible example,而不仅仅是代码的 sn-ps 并说明您的期望和当前得到的结果,而不仅仅是“它不工作” . 【参考方案1】:

首先,如果你要假设一个特定的布局,你应该将你的类型标记为repr(C)

#[repr(C)]
pub struct ChangedCell(pub bool, pub u32, pub u32);

如果没有repr(C),您可能会得到与我们相同的布局,但只有在您明确编写时才能得到保证。

现在你可以保证一个 C 兼容的布局,wasm32 中的(注意填充!)将是:

bool:偏移量 0,1 字节,0x00 或 0x01。 u32:偏移量4,4字节, u32:偏移量8,4字节,

总大小:12 字节。字节 1、2 和 3 是填充,因此未使用。

【讨论】:

以上是关于如何从 Wasm 内存缓冲区中读取元组结构?的主要内容,如果未能解决你的问题,请参考以下文章

libpng 从内存缓冲区加载文件

我应该如何释放类型映射中为 argout 结构数组分配的内存?

如何从节点中的ReadStream同步读取

从 wasm 修改画布

python多线程读取只读内存缓冲区绕过GIL

处理来自内存缓冲区的视频流