如何快速读取本地二进制文件到UInt8Array。在下面的代码中
function readAllBytesAsUInt8Array(path) {
var req = new XMLHttpRequest();
req.open("GET", path, false);
req.overrideMimeType("text/plain; charset=binary-data");
req.send(null);
if (req.status !== 200) {
console.log("error");
return null;
}
var text = req.responseText;
var resultArray = new Uint8Array(text.length);
for(var i = 0; i < text.length;i++){
resultArray[i] = (text[i].charCodeAt() & 255) & 255;
}
return resultArray.buffer;
}
执行 var text = req.responseText;
不到一秒,同时这部分
var resultArray = new Uint8Array(text.length);
for(var i = 0; i < text.length;i++){
resultArray[i] = (text[i].charCodeAt() & 255) & 255;
}
对于50MB的二进制文件,大约需要10秒 有没有办法更快地将二进制文件读取到UInt8Array?
答案 0 :(得分:1)
您可以将.responseType
XMLHttpRequest()
设置为"arraybuffer"
,然后将ArrayBuffer
实例传递给new Uint8Array()
。或者,您可以使用fetch()
中的Response.arrayBuffer()
和FileReaderSync()
或Worker
将ArrayBuffer
转移到主线程,而无需复制ArrayBuffer
。
req.responseType = "arraybuffer";
let buffer = req.response;
let u = new Uint8Array(buffer);
答案 1 :(得分:0)
您可以使用TextEncoder! TextEncoder将一串代码点作为输入,并发出一个字节流。
这是您的新代码:)
function readAllBytesAsUInt8Array(path) {
var req = new XMLHttpRequest();
req.open("GET", path, false);
req.overrideMimeType("text/plain; charset=binary-data");
req.send(null);
if (req.status !== 200) {
console.log("error");
return null;
}
var text = req.responseText;
var encoder = new TextEncoder("utf-8");
var resultArray = encoder.encode(text);
return resultArray.buffer;
}
看看它是如何工作的,应该快得多。