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

1 rust webassembly wasm-bindgen

我定义了一个元组结构:

pub struct ChangedCell(pub bool, pub u32, pub u32);
Run Code Online (Sandbox Code Playgroud)

我的假设

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

我做了什么

我向 JavaScript返回了一个pointer, lengthfor :Vec<ChangedCell>

pub struct ChangedCell(pub bool, pub u32, pub u32);
Run Code Online (Sandbox Code Playgroud)
const arr = new Uint8Array(memory.buffer, pointer, length * 9);
Run Code Online (Sandbox Code Playgroud)

预期行为

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

问题

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

rod*_*igo 5

首先,如果您要采用特定的布局,您应该将您的类型标记为repr(C)

#[repr(C)]
pub struct ChangedCell(pub bool, pub u32, pub u32);
Run Code Online (Sandbox Code Playgroud)

很可能在不使用我们的情况下获得相同的布局repr(C),但只有在显式编写时才能得到保证。

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

  • bool:偏移量0、1个字节、0x00 或 0x01。
  • u32:在偏移量4 处,4 个字节,
  • u32:在偏移量8 处,4 个字节,

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