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

时间:2020-08-05 11:50:17

标签: rust wasm-bindgen webassembly

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

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

我的假设

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

我做了什么

我将pointer, length的{​​{1}}返回到JavaScript:

Vec<ChangedCell>
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
  • [byte]成为val1
  • [byte] * 4成为val2

问题

您如何将此类内容读入JavaScript?

1 个答案:

答案 0 :(得分:5)

首先,如果要采用特定的布局,则应将类型标记为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正在填充,因此未使用。

相关问题