如何从 Wasm 内存缓冲区中读取元组结构?
Posted
技术标签:
【中文标题】如何从 Wasm 内存缓冲区中读取元组结构?【英文标题】:How do I read a tuple struct from a Wasm memory buffer? 【发布时间】:2020-11-25 14:14:44 【问题描述】:我已经定义了一个元组结构:
pub struct ChangedCell(pub bool, pub u32, pub u32);
我的假设
ChangedCell
有 9 个字节(bool
:1 个字节,u32
:4 个字节,u32
:4 个字节)
我做了什么
我将pointer, length
的Vec<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 并说明您的期望和当前得到的结果,而不仅仅是“它不工作” . 【参考方案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 是填充,因此未使用。
【讨论】:
以上是关于如何从 Wasm 内存缓冲区中读取元组结构?的主要内容,如果未能解决你的问题,请参考以下文章