Emscripten: нулевое завершение Uint8Array? - PullRequest
0 голосов
/ 12 июля 2020

Я анализирую файлы, прочитанные с помощью 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 было завершено нулем, хотя проверяю, что код C не go прошлое data.length работает. Одна мысль - вызвать Module._malloc(data.length + 1) и добавить нулевой символ внутри C. Мысли?

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Вызов Module._malloc(data.length + 1) с последующим присвоением последнему элементу значения NULL внутри кода C, похоже, работает. Ответ @ GirkovArpa немного медленнее (примерно на 10% медленнее для первого чтения файла и примерно на 30% медленнее для второго на основе console.time()).

0 голосов
/ 12 июля 2020

Вы можете завершить саму data, чтобы data_ptr указывало на массив char с завершающим нулем:

var data = new Uint8Array([...new Uint8Array(reader.result), 0]);
...