Emscripten:空终止 Uint8Array?
Emscripten: null terminate Uint8Array?
我正在解析使用 FileReader.readAsArrayBuffer() 读入的文件,如
var reader = new FileReader();
reader.onload = function() {
var data = new Uint8Array(reader.result);
const data_ptr = Module._malloc(data.length);
if (data_ptr == null) {
display_error("Could not allocate " + data.length + " bytes for file " + file.name);
}
else {
Module.HEAPU8.set(data, data_ptr);
var readSample = cwrap("readSample", "number", ["number", "number"]);
var ret = readSample(data_ptr, data.length);
Module._free(data_ptr);
}
}
reader.readAsArrayBuffer(file);
如果 data_ptr
以 null 终止就更好了,尽管检查 C 代码没有超过 data.length 是可行的。一种想法是调用Module._malloc(data.length + 1)
,在C里面加上空字符。想法?
您可以以空值终止 data
本身,以便 data_ptr
指向一个以空值终止的数组 char
:
var data = new Uint8Array([...new Uint8Array(reader.result), 0]);
调用 Module._malloc(data.length + 1)
然后在 C 代码中将最后一个元素设置为 null 似乎确实有效。 @GirkovArpa 的回答有点慢(第一个文件读取速度慢 10%,第二个速度慢 30% 左右,基于 console.time()
)。
我正在解析使用 FileReader.readAsArrayBuffer() 读入的文件,如
var reader = new FileReader();
reader.onload = function() {
var data = new Uint8Array(reader.result);
const data_ptr = Module._malloc(data.length);
if (data_ptr == null) {
display_error("Could not allocate " + data.length + " bytes for file " + file.name);
}
else {
Module.HEAPU8.set(data, data_ptr);
var readSample = cwrap("readSample", "number", ["number", "number"]);
var ret = readSample(data_ptr, data.length);
Module._free(data_ptr);
}
}
reader.readAsArrayBuffer(file);
如果 data_ptr
以 null 终止就更好了,尽管检查 C 代码没有超过 data.length 是可行的。一种想法是调用Module._malloc(data.length + 1)
,在C里面加上空字符。想法?
您可以以空值终止 data
本身,以便 data_ptr
指向一个以空值终止的数组 char
:
var data = new Uint8Array([...new Uint8Array(reader.result), 0]);
调用 Module._malloc(data.length + 1)
然后在 C 代码中将最后一个元素设置为 null 似乎确实有效。 @GirkovArpa 的回答有点慢(第一个文件读取速度慢 10%,第二个速度慢 30% 左右,基于 console.time()
)。