如何从 Wasm 内存缓冲区读取元组结构?
How do I read a tuple struct from a Wasm memory buffer?
我已经定义了一个元组结构:
pub struct ChangedCell(pub bool, pub u32, pub u32);
我的假设
ChangedCell
占9个字节(bool
:1个字节,u32
:4个字节,u32
:4个字节)
我做了什么
我为 Vec<ChangedCell>
返回了一个 pointer, length
到 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?
首先,如果您要假设一个特定的布局,您应该将您的类型标记为 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 是填充的,因此未使用。
我已经定义了一个元组结构:
pub struct ChangedCell(pub bool, pub u32, pub u32);
我的假设
ChangedCell
占9个字节(bool
:1个字节,u32
:4个字节,u32
:4个字节)
我做了什么
我为 Vec<ChangedCell>
返回了一个 pointer, length
到 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?
首先,如果您要假设一个特定的布局,您应该将您的类型标记为 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 是填充的,因此未使用。