首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调整ArrayBuffer大小

调整ArrayBuffer大小
EN

Stack Overflow用户
提问于 2013-09-03 20:26:50
回答 5查看 18.5K关注 0票数 19

如果我想创建一个数组缓冲区,我编写:var buff = new ArrayBuffer(size)

但是,如何调整现有缓冲区的大小呢?我的意思是,在缓冲区的末尾再加一些字节。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-09-03 20:54:11

代码语言:javascript
复制
var buff = new ArrayBuffer(32);
buff[31] = 43;
var newBuff = new ArrayBuffer(buff.byteLength*2);

for (var i=0;i<buff.byteLength;i++){
    newBuff[i] = buff[i];
}

buff = newBuff;

我在C++做过这样的事。只需创建一个较大的数组并将内容复制到上面,然后返回较大的数组并将其设置为原始数组。

票数 -10
EN

Stack Overflow用户

发布于 2016-10-29 23:38:36

ArrayBuffer本身没有设置。不过,set在TypedArray上。像这样使用:

代码语言:javascript
复制
var oldBuffer = new ArrayBuffer(20);

var newBuffer = new ArrayBuffer(40);
new Uint8Array(newBuffer).set(oldBuffer);
票数 26
EN

Stack Overflow用户

发布于 2017-10-08 13:22:38

这样做的方法是ArrayBuffer.transfer(oldBuffer, newByteLength),如下所示:

代码语言:javascript
复制
var buffA = new ArrayBuffer(30);
var buffB = ArrayBuffer.transfer(buffA, 40);

// buffA is now an empty array buffer (`buffA.byteLength === 0`)
// whereas buffB is a new buffer that starts with a's contents
// and ends with 10 bytes that are 0s.

// Much faster than manually copying. You could even just do:

var buffA = new ArrayBuffer(30);
buffA = ArrayBuffer.transfer(buffA, 40);

// Or as a prototype method

ArrayBuffer.prototype.resize = function(newByteLength) {
    return ArrayBuffer.transfer(this, newByteLength);
}

var buffA = new ArrayBuffer(30);
buffA = buffA.resize(40);

然而(截至2017年10月),浏览器支持率为0% (甚至连Node.js支持都没有),甚至还没有起草。

在可用之前,您可以使用页面上给定的多边形填充,它一次复制8个字节,因此对于大型数组(虽然它没有空给定的数组,这是不可能的),速度相对较快。

下面是一个使用.prototype.set而不是for循环的修改版本:

代码语言:javascript
复制
if (!ArrayBuffer.transfer) {
  ArrayBuffer.transfer = function(oldBuffer, newByteLength) {
    var srcBuffer = Object(oldBuffer);
    var destBuffer = new ArrayBuffer(newByteLength);
    if (!(srcBuffer instanceof ArrayBuffer) || !(destBuffer instanceof ArrayBuffer)) {
      throw new TypeError('Source and destination must be ArrayBuffer instances');
    }
    var copylen = Math.min(srcBuffer.byteLength, destBuffer.byteLength);

    /* Copy 8 bytes at a time */
    var length = Math.trunc(copylen / 64);
    (new Float64Array(destBuffer, 0, length))
      .set(new Float64Array(srcBuffer, 0, length));

    /* Copy the remaining 0 to 7 bytes, 1 byte at a time */
    var offset = length * 64;
    length = copylen - offset;
    (new Uint8Array(srcBuffer, offset, length))
      .set(new Uint8Array(destBuffer, offset, length));

    return destBuffer;
  };
}

编辑

不使用ArrayBuffer命名空间的上述替代版本,并采取稍微不同的方法

代码语言:javascript
复制
          function arrayBufferTransfer(oldBuffer, newByteLength) {
             const 
             srcArray  = new Uint8Array(oldBuffer),
             destArray = new Uint8Array(newByteLength),
             copylen = Math.min(srcArray.buffer.byteLength, destArray.buffer.byteLength),
             floatArrayLength   = Math.trunc(copylen / 8),
             floatArraySource   = new Float64Array(srcArray.buffer,0,floatArrayLength),
             floarArrayDest     = new Float64Array(destArray.buffer,0,floatArrayLength);
             
             floarArrayDest.set(floatArraySource);
                 
             let bytesCopied = floatArrayLength * 8;
             
         
             // slowpoke copy up to 7 bytes.
             while (bytesCopied < copylen ) {
                 destArray[bytesCopied]=srcArray[bytesCopied];
                 bytesCopied++;
             }
             
           
             return destArray.buffer;
         }
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18600895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档