Передача байтового массива (Uint8Array) между WebAssembly и JavaScript - PullRequest
0 голосов
/ 18 января 2020

У меня есть массив u8 [] в коде WebAssembly, как я могу читать его обычным JS? Звонки на него просто верните мне i32.

// Load module WebAssembly.Instance
const instance = await getInstance("./build/embed.wasm");

// Try to get the array of bytes from the module
const embeddedFileBytes = Uint8Array.from(instance.fileBytes);

// write the file to disc
await writeFile("./output.text", embeddedFileBytes);

// check the hash is the same as the original file that was embedded
expect(sha1("./output.text")).toEqual(sha1("./input.text"))

Модуль веб-сборки имеет экспорт:

export const fileBytes: u8[] = [83,65,77,80,76,69,10];

1 Ответ

1 голос
/ 19 января 2020

WebAssembly - это виртуальная машина низкого уровня, которая поддерживает только типы c. Более сложные типы, такие как строки, структуры и массивы, кодируются в линейной памяти WebAssembly , которая является непрерывным блоком памяти, в который WebAssembly и JavaScript могут читать и записывать.

Значение, возвращаемое fileBytes, это не сам массив, а указатель на местоположение массива в линейной памяти. Чтобы получить данные из массива, вам нужно будет прочитать их из линейной памяти - почти так же, как вы читали бы строку, как описано в следующем вопросе:

Как можно ли вернуть JavaScript строку из функции WebAssembly

Если вы не хотите самостоятельно писать этот «клейкий» код, я бы порекомендовал изучить wasm-bindgen

...