附加ArrayBuffers

use*_*750 29 javascript typed-arrays arraybuffer

添加/组合ArrayBuffers的首选方法是什么?

我正在接收和解析具有各种数据结构的网络数据包.传入消息将读入ArrayBuffers.如果部分数据包到达,我需要存储它并在重新尝试解析它之前等待下一条消息.

目前我正在做这样的事情:

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.buffer;
}
Run Code Online (Sandbox Code Playgroud)

显然你不能不得不创建一个新的缓冲区,因为ArrayBuffers的长度是固定的,但是有必要初始化类型化的数组吗?到达后我只想要能够将缓冲区视为缓冲区; 类型和结构无关紧要.

Jb *_*ker 7

为什么不使用Blob?(我意识到当时可能还没有).

只需使用您的数据创建Blob,var blob = new Blob([array1,array2,string,...])然后使用FileReader将其转换回ArrayBuffer(如果需要)(请参阅此内容).

检查一下:BlobBuilder和新的Blob构造函数有什么区别? 这个:MDN Blob API

编辑:

我想比较这两种方法(Blob和问题中使用的方法)的效率并创建一个JSPerf:http://jsperf.com/appending-arraybuffers

似乎使用Blob更慢(事实上,我猜这是使用Filereader来读取花费最多时间的Blob).所以现在你知道;)当有超过2个ArrayBuffer(比如从它的块中重建文件)时,它可能会更有效率.


小智 -3

您始终可以使用DataViewhttp://www.khronos.org/registry/typedarray/specs/latest/#8)而不是特定的类型数组,但正如您的问题的评论中所提到的,您实际上不能ArrayBuffer自己做很多事情。

  • 如果目的只是复制数据,那么将所有内容都视为 Uint8 并没有什么问题,这里就是这种情况。如果您需要 DataView 的灵活性,它会非常有用,但为此目的它的性能要差得多。请参阅:http://jsperf.com/uint8array-vs-dataview3 (8认同)