Использование readAsArrayBuffer
.
readAsBinaryString()
и readAsDataURL()
заставят ваш компьютер выполнять намного больше работы, чем необходимо:
- читать BLOB-объекты как двоичный поток
- преобразовать в строку UTF-16 / base64 (помните, что строки не являются изменяемыми в js, любая операция, которую вы над ней выполняете, фактически создает копию в памяти)
- [перейти к вашей библиотеке]
- преобразовать в двоичную строку
- обработка данных
Кроме того, похоже, что ваша библиотека не обрабатывает URL-адреса данных и не работает со строками UTF-16.
readAsText()
по умолчанию попытается интерпретировать ваши двоичные данные как текстовую последовательность UTF-8, что довольно плохо для двоичных данных, таких как растровое изображение:
// generate some binary data
document.createElement('canvas').toBlob(blob => {
const utf8_reader = new FileReader();
const bin_reader = new FileReader();
let done = 0;
utf8_reader.onload = bin_reader.onload = e => {
if(++done===2) {
console.log('same results: ', bin_reader.result === utf8_reader.result);
console.log("utf8\n", utf8_reader.result);
console.log("utf16\n", bin_reader.result);
}
}
utf8_reader.readAsText(blob);
bin_reader.readAsBinaryString(blob);
});
readAsArrayBuffer
, с другой стороны, будет просто распределять двоичные данные как есть в памяти. Простой ввод / вывод, без обработки.
Чтобы манипулировать этими данными, мы можем использовать представления TypedArrays для этих двоичных данных, которые, будучи только представлениями, также не будут создавать никаких накладных расходов.
И если вы посмотрите на библиотеку, которую вы используете , они все равно передадут ваш ввод в такой массив Uint8Array для дальнейшей обработки. Однако имейте в виду, что они, очевидно, нуждаются в том, чтобы вы передавали представление ArintBuffer в Uint8Array вместо обнаженного ArrayBuffer напрямую.