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

How do I read a tuple struct from a Wasm memory buffer?

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

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

我的假设

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

我做了什么

我为 Vec<ChangedCell> 返回了一个 pointer, length 到 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}
}

预期行为

问题

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

首先,如果您要假设一个特定的布局,您应该将您的类型标记为 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 是填充的,因此未使用。