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())。