如何将两个数组缓冲区合并为一个?

如何将两个数组缓冲区合并为一个?

问题描述:

我有一个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; 
 
};

虽然上述作品,与把它一粒盐,因为我对自己在做的事情有限的理解,我不知道这是最好解决方案

+0

这正是我想要做的。将不得不简化一点。一个问题的结果是像fileReader.result数组缓冲区? – Zahema

+0

@Zahema结果是Uint8Array类型。为了得到一个类似于fileReader.result的ArrayBuffer,你将需要使用result.buffer,这将为你提供如果被引用但是Uint8Array的ArrayBuffer。请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array –