【问题标题】:How do I read a tuple struct from a Wasm memory buffer?如何从 Wasm 内存缓冲区中读取元组结构?
【发布时间】: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 并说明您的期望和当前得到的结果,而不仅仅是“它不工作” .

标签: rust wasm-bindgen webassembly


【解决方案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 是填充,因此未使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多