Ошибка компиляции: WebAssembly.compile (): ожидаемое слово волшебный c - PullRequest
0 голосов
/ 03 марта 2020

Я новичок в WebAssembly и пытаюсь заставить работать базовый c пример, но загрузка файла .wasm в Google Chrome возвращает:

CompileError: WebAssembly.compile ( ): ожидаемые маги c слово 00 61 73 6d, найдено 30 30 36 31 @ + 0

Это код C ++:

#include <iostream>
using namespace std;

int main() 
{
    cout << "Hello, World!";
    return 0;
}

И это WASM файл: https://drive.google.com/open?id=1nvoxoeZ6TA9OVc4JFHSwGIVxuDHFnIU1

Код, который я выполняю в Chrome, на основе документации :

function instantiate(bytes, imports) {
  return WebAssembly.compile(bytes).then(function(m) {
      return new WebAssembly.Instance(m, imports)
  });
}

fetch('simple.wasm').then(function(response) {
    return response.arrayBuffer()
})
.then(function(bytes) {
    var importObject = {
        imports: {
            i: function(arg) {
                console.log(arg)
            }
        }
    };
    return instantiate(bytes, importObject)
})
.then(function(instance) {
    return instance.exports.e()
})

1 Ответ

0 голосов
/ 03 марта 2020

Проблема в том, что ваш .wasm файл находится в шестнадцатеричном формате, а не в двоичном.

Возможно, вам следует проверить флаги компиляции, но вы также можете преобразовать его обратно из шестнадцатеричного с помощью чего-то вроде это или как это:

function fromHex(hexString) {
  return new Uint8Array(hexString.match(/[0-9a-f]{2}/g).map(byte => parseInt(byte, 16)));
}

function instantiate(bytes, imports) {
  return WebAssembly.compile(bytes).then(function(m) {
      return new WebAssembly.Instance(m, imports)
  });
}

fetch('simple.wasm').then(function(response) {
    return response.text()
})
.then(function(text) {
    const bytes = fromHex(text);
    var importObject = {
        imports: {
            i: function(arg) {
                console.log(arg)
            }
        }
    };
    return instantiate(bytes, importObject)
})
.then(function(instance) {
    return instance.exports.e()
})
...