一种方法是使用 Emscripten 文件系统 API,例如在 Module preRun 函数中调用FS.init,将自定义函数作为标准输入传递。
var Module = {
preRun: function() {
function stdin() {
// Return ASCII code of character, or null if no input
}
var stdout = null; // Keep as default
var stderr = null; // Keep as default
FS.init(stdin, stdout, stderr);
}
};
该功能非常低级:一次必须处理一个字符。要从 blob 中读取一些数据,您可以执行以下操作:
var data = new Int8Array([1,2,3,4,5]);
var blob = new Blob([array], {type: 'application/octet-binary'});
var reader = new FileReader();
var result;
reader.addEventListener("loadend", function() {
result = new Int8Array(reader.result);
});
var i = 0;
var Module = {
preRun: function() {
function stdin() {
if (if < result.byteLength {
var code = result[i];
++i;
return code;
} else {
return null;
}
}
var stdout = null; // Keep as default
var stderr = null; // Keep as default
FS.init(stdin, stdout, stderr);
}
};
注意(正如您所暗示的),由于阅读器的异步特性,可能存在竞争条件:阅读器必须已加载,然后您才能在标准输入中预期数据。在实际情况下,您可能需要实现一些机制来避免这种情况。main()
根据您的确切要求,您可以这样做,以便 Emscripten 程序在您拥有数据之前不会实际调用:
var fileRead = false;
var initialised = false;
var result;
var array = new Int8Array([1,2,3,4,5]);
var blob = new Blob([array], {type: 'application/octet-binary'});
var reader = new FileReader();
reader.addEventListener("loadend", function() {
result = new Int8Array(reader.result);
fileRead = true;
runIfCan();
});
reader.readAsArrayBuffer(blob);
var i = 0;
var Module = {
preRun: function() {
function stdin() {
if (i < result.byteLength)
{
var code = result[i];
++i;
return code;
} else{
return null;
}
}
var stdout = null;
var stderr = null;
FS.init(stdin, stdout, stderr);
initialised = true;
runIfCan();
},
noInitialRun: true
};
function runIfCan() {
if (fileRead && initialised) {
// Module.run() doesn't seem to work here
Module.callMain();
}
}
注意:这是我在为 emscripten HTML 程序提供标准输入的答案的一个版本?,但重点关注标准输入,并添加有关从 Blob 传递数据的部分。