Вопрос по javascript – Какой самый простой способ скопировать объект ArrayBuffer?

21

Я работаю сArrayBuffer объекты, и я хотел бы дублировать их. Хотя это довольно легко с фактическими указателями иmemcpyЯ не могу найти какой-либо прямой способ сделать это в Javascript.

Прямо сейчас, вот как я копируюArrayBuffers:

function copy(buffer)
{
    var bytes = new Uint8Array(buffer);
    var output = new ArrayBuffer(buffer.byteLength);
    var outputBytes = new Uint8Array(output);
    for (var i = 0; i < bytes.length; i++)
        outputBytes[i] = bytes[i];
    return output;
}

Есть ли более красивый способ?

Ваш Ответ

5   ответов
35

function copy(src)  {
    var dst = new ArrayBuffer(src.byteLength);
    new Uint8Array(dst).set(new Uint8Array(src));
    return dst;
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededfastest than the chosen one.
Error: User Rate Limit Exceeded
22

var a = new Uint8Array([2,3,4,5]);
var b = new Uint8Array(a);
a[0] = 6;
console.log(a); // [6, 3, 4, 5]
console.log(b); // [2, 3, 4, 5]

Испытано в FF 33 и Chrome 36.

Error: User Rate Limit Exceededjsben.ch/rkCpxError: User Rate Limit Exceeded
Error: User Rate Limit Exceedednew Uint8Array(a.buffer)Error: User Rate Limit ExceedednotError: User Rate Limit ExceededbyteOffsetError: User Rate Limit ExceededlengthError: User Rate Limit ExceededBuffer.from(Buffer, byteOffset, length)Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
25

ArrayBuffer должен поддерживатьslice (http://www.khronos.org/registry/typedarray/specs/latest/), так что вы можете попробовать,

который работает в Chrome 18, но не в Firefox 10 или 11. Что касается Firefox, вам нужно скопировать его вручную. Вы можете обезьяна исправитьslice() в Firefox, потому что Chromeslice() превзойдет ручную копию. Это будет выглядеть примерно так:

if (!ArrayBuffer.prototype.slice)
    ArrayBuffer.prototype.slice = function (start, end) {
        var that = new Uint8Array(this);
        if (end == undefined) end = that.length;
        var result = new ArrayBuffer(end - start);
        var resultArray = new Uint8Array(result);
        for (var i = 0; i < resultArray.length; i++)
           resultArray[i] = that[i + start];
        return result;
    }

Тогда вы можете позвонить,


скопировать массив в Chrome и Firefox.

Error: User Rate Limit Exceededslice()Error: User Rate Limit Exceededbuffer.slice().
Error: User Rate Limit ExceededArrayBufferError: User Rate Limit Exceededslice()Error: User Rate Limit ExceededUint8ArrayError: User Rate Limit Exceededsubarray()Error: User Rate Limit ExceededArrayBuffer.
Error: User Rate Limit Exceededsubarray()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededsubarray()Error: User Rate Limit Exceededslice().
Error: User Rate Limit Exceeded
2

который вы хотите нарезать (что логично, так и должно быть), это может сработать.

 if (!Uint8Array.prototype.slice && 'subarray' in Uint8Array.prototype)
     Uint8Array.prototype.slice = Uint8Array.prototype.subarray;
2

льзовать ~ 8x меньше операций копирования на больших типизированных массивах. Обычно мы копируем как можно больше 8-байтовых блоков, а затем копируем оставшиеся 0-7 байтов. Это особенно полезно в текущей версии IE, поскольку в нем не реализован метод слайса для ArrayBuffer.

if (!ArrayBuffer.prototype.slice)
    ArrayBuffer.prototype.slice = function (start, end) {
    if (end == undefined) end = that.length;
    var length = end - start;
    var lengthDouble = Math.floor(length / Float64Array.BYTES_PER_ELEMENT); 
    // ArrayBuffer that will be returned
    var result = new ArrayBuffer(length);

    var that = new Float64Array(this, start, lengthDouble)
    var resultArray = new Float64Array(result, 0, lengthDouble);

    for (var i = 0; i < resultArray.length; i++)
       resultArray[i] = that[i];

    // copying over the remaining bytes
    that = new Uint8Array(this, start + lengthDouble * Float64Array.BYTES_PER_ELEMENT)
    resultArray = new Uint8Array(result, lengthDouble * Float64Array.BYTES_PER_ELEMENT);

    for (var i = 0; i < resultArray.length; i++)
       resultArray[i] = that[i];

    return result;
}
Error: User Rate Limit ExceededArrayBuffer length minus the byteOffset is not a multiple of the element size.Error: User Rate Limit Exceeded

Похожие вопросы