1

我定义了一个元组结构:

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

我的假设

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

我做了什么

我为JavaScript返回了一个pointer, lengthfor :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成为valid [byte]
  • val1成为valid [byte] * 4
  • val2成为valid [byte] * 4

问题

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

4

1 回答 1

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 是填充,因此未使用。

于 2020-08-05T12:39:33.313 回答