如何将两个ArrayBuffer合并为一个?

4
我有一个大的RAR文件的二进制数据。要解压缩它,我必须使用这个库unrar.js
我正在测试的二进制数据大小约为23MB,为了将其读取为ArrayBuffer并将其提供给unrar.js,我必须对其进行切片。
由于某种原因,unrar.js与切片的二进制数据不兼容——如果切片的范围不以0开头或以blob.size结尾,则会抛出未知的存档类型错误。这很奇怪。
我能想到的唯一解决方法是在onloadend函数中逐步读取二进制数据,然后再将其收集回来。这是否可能呢?
将数组缓冲区收集到一个数组中,然后将其提供给unrar.js,以便像从一个二进制数据块中读取一样解压缩文件。
如果这听起来太麻烦了,我会感激任何其他在javascript/phonegap环境中读取RAR文件的方法。
1个回答

5

我不确定我完全理解为什么要对blob进行分段,但如果需要的话,你可以做如下操作:

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 - Dustin Simpson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接