如何将两个数组缓冲区合并为一个?
问题描述:
我有一个rar文件的大块。要解压缩它,我必须使用这个库unrar.js如何将两个数组缓冲区合并为一个?
我测试的blob大概是23MB,要读取asArrayBuffer然后将其提供给unrar.js我必须将其切片。
由于某些原因,unrar.js与切片blob不能很好地协作 - 如果切片blob范围不以0开头或以blob.size结束,它会抛出未知的归档类型错误。 - 奇怪? -
我能想到的唯一解决方法是将块读为片,然后在onloadend函数中再次收集它。 - 甚至有可能吗? -
将阵列缓冲区收集到一个阵列中然后将其馈送到unrar.js以解压缩文件,就好像它是从一个blob读取的一样。
如果这听起来太烦人,我会很感激任何其他方式来阅读JavaScript /手机环境中的RAR文件。
答
我不知道我完全理解为什么斑被分割,但如果是这样,你也许可以这样做:
var blobs = [new Blob(['Hello ']),new Blob(['World'])];
var buffers = [];
var buffersFilled = 0;
for(var i=0; i < blobs.length; i++) {
buffers.push(new Uint8Array());
}
for(var i=0; i<blobs.length; i++) {
var fileReader = new FileReader();
fileReader.onload = (function(i,fileReader) {
return function(){
buffers[i] = fileReader.result;
isBuffersDone();
}
})(i,fileReader);
fileReader.readAsArrayBuffer(blobs[i]);
}
function isBuffersDone() {
buffersFilled++;
if(buffersFilled >= blobs.length) {
var result = spliceBuffers();
//*****************
// result is the spliced together buffers that could be given to unrar.js
console.log(result);
}
}
function spliceBuffers() {
var tmpResult = new Uint8Array();
for(var i=0; i < buffers.length; i++) {
tmpResult = appendBuffer(tmpResult, buffers[i]);
}
return tmpResult;
}
function appendBuffer(buffer1, buffer2) {
var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
tmp.set(new Uint8Array(buffer1), 0);
tmp.set(new Uint8Array(buffer2), buffer1.byteLength);
return tmp;
};
虽然上述作品,与把它一粒盐,因为我对自己在做的事情有限的理解,我不知道这是最好解决方案
这正是我想要做的。将不得不简化一点。一个问题的结果是像fileReader.result数组缓冲区? – Zahema
@Zahema结果是Uint8Array类型。为了得到一个类似于fileReader.result的ArrayBuffer,你将需要使用result.buffer,这将为你提供如果被引用但是Uint8Array的ArrayBuffer。请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array –