将blob转换为arraybuffer而不使用filereader / xmlttprequest

时间:2017-10-28 08:46:35

标签: javascript blob arraybuffer

我想将ArrayBuffer(简称100MB)转换为Blob,然后从Blob转换回ArrayBuffer而不复制数据。
FileReader / XMLHttpRequest会复制数据,还有其他方法吗?

var b = new Blob([new Uint8Array(someArrayBuffer)]);

PS:我想进行大型只读缓冲区的交叉表通信而不重复它,例如本地ArrayBuffer是500MB我想在多个标签中使用它而不重复数据。

1 个答案:

答案 0 :(得分:1)

可能有一些方法可以在没有FileReader或XHR的情况下将Blob转换为ArrayBuffer,但无论如何它们都会复制数据。

但听起来你需要的不是从Blob转换为ArrayBuffer,而是跨标签共享你的ArrayBuffer或Blob。

为此,您有多种方式:

  • 将ArrayBuffer / Blob存储在主页面上,并直接从子页面访问它,就像您可以访问任何其他全局变量一样:

    ["/usr/bin/g++", "-Wall"] + fileList + ["-lglut", "-lGLU", "-lGL", "-std=c+11", "-o", "test", 'main.cpp']
    
    // in parent
    window.myArrayBuffer = buffer;
    

    Plnkr

  • 如果您一次只需要在一个选项卡中访问ArrayBuffer,那么您可以使用// in child var buf = window.opener.myArrayBuffer; doSomethingWithBuffer(buf); API将其缓冲区传输到其他页面。

    postMessage

    // in parent
    child.postMessage(myArrayBuffer, 'origin', [myArrayBuffer]);
    // here myArrayBuffer's buffer is *transferred* to child,
    // it can't be accessed by parent anymore
    

    Plnkr

  • 如果您只需要在不同但来自同源窗口上显示Blob,请使用blobURI。它只会创建一个指向内存中数据的指针,并将这些数据从垃圾收集中锁定,直到你的文档死掉,但不会复制数据。

  • 如果您不需要支持IE或Safari,您甚至可以考虑首先转移ArrayBuffer的SharedWorkers,并让所有标签让它执行计算,基于相同的数据。