Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中向ArrayBuffer追加字节、多字节和缓冲区?_Javascript_Buffer_Arraybuffer_Typed Arrays - Fatal编程技术网

如何在javascript中向ArrayBuffer追加字节、多字节和缓冲区?

如何在javascript中向ArrayBuffer追加字节、多字节和缓冲区?,javascript,buffer,arraybuffer,typed-arrays,Javascript,Buffer,Arraybuffer,Typed Arrays,Javascript ArrayBuffer或TypedArrays没有任何类型的appendByte()、appendBytes()或appendBuffer()方法。所以,如果我想一次填充一个数组缓冲一个值,我该怎么做呢 var firstVal = 0xAB; // 1 byte var secondVal = 0x3D7F // 2 bytes var anotherUint8Array = someArr; var buffer = n

Javascript ArrayBuffer或TypedArrays没有任何类型的appendByte()、appendBytes()或appendBuffer()方法。所以,如果我想一次填充一个数组缓冲一个值,我该怎么做呢

var firstVal = 0xAB;              // 1 byte
var secondVal = 0x3D7F            // 2 bytes
var anotherUint8Array = someArr;

var buffer = new ArrayBuffer();   // I don't know the length yet
var bufferArr = new UInt8Array(buffer);

// following methods do not exist. What are the alternatives for each??
bufferArr.appendByte(firstVal);
bufferArr.appendBytes(secondVal);
bufferArr.appendBuffer(anotherUint8Array);
可以使用新的ArrayBuffer创建新的TypedArray,但不能更改现有缓冲区的大小

function concatTypedArrays(a, b) { // a, b TypedArray of same type
    var c = new (a.constructor)(a.length + b.length);
    c.set(a, 0);
    c.set(b, a.length);
    return c;
}
现在我能做什么

var a = new Uint8Array(2),
    b = new Uint8Array(3);
a[0] = 1; a[1] = 2;
b[0] = 3; b[1] = 4;
concatTypedArrays(a, b); // [1, 2, 3, 4, 0] Uint8Array length 5
如果要使用不同的类型,请通过
Uint8Array
,因为最小的单位是字节,即

这意味着
.length
将按预期工作,您现在可以将其转换为您选择的键入数组(确保它是接受缓冲区
.bytellength
的类型)


从这里,您现在可以实现任何连接数据的方法,例如

function concatBytes(ui8a, byte) {
    var b = new Uint8Array(1);
    b[0] = byte;
    return concatTypedArrays(ui8a, b);
}

var u8 = new Uint8Array(0);
u8 = concatBytes(u8, 0x80); // [128]

Paul的答案允许您将一个TypedArray连接到现有的TypedArray。在ES6中,可以使用以下函数连接多个TypeDarray:

function concatenate(resultConstructor, ...arrays) {
    let totalLength = 0;
    for (const arr of arrays) {
        totalLength += arr.length;
    }
    const result = new resultConstructor(totalLength);
    let offset = 0;
    for (const arr of arrays) {
        result.set(arr, offset);
        offset += arr.length;
    }
    return result;
}

const ta = concatenate(Uint8Array,
    Uint8Array.of(1, 2), Uint8Array.of(3, 4));
console.log(ta); // Uint8Array [1, 2, 3, 4]
console.log(ta.buffer.byteLength); // 4
要附加新字节,请执行以下操作:

const byte = 3;
concatenate(Uint8Array, Uint8Array.of(1, 2), Uint8Array.of(byte));

此方法位于。

它是一个数组,请使用数组语法
r[i]=x
ex:还要检查Uint8Array构造函数的语法:-您需要该数组缓冲区的大小才能这样使用它….在创建缓冲区后不能修改缓冲区大小hanks@Paul S。将这些基本函数作为规范的一部分并以本机方式实现会很好,但您的解决方案非常好。我还有一个问题,就是如何在typedarray中附加一个多字节,比如一个4字节的值。我们可以为每个字节多次循环调用您建议的
concatBytes
函数,但能否以更好的方式完成此操作?@codneto您的多字节是如何存储的?e、 g.如果您使用的是ints,您如何知道
0x3D7F
0x00003D7F
之间的区别?是的,我同意应该有一些原生的
concat
,但我不认为应该有原生的
push
或长度更改-这不是类型化数组的工作方式,我有一些函数返回需要添加到缓冲区的4字节值。我还从流中读取一些字节并附加到缓冲区,有时根据一些标志,我必须读取1、2或4字节的值,所有这些都需要附加到缓冲区。如何将这些多字节值附加到缓冲区?@codneto将其作为循环写入。循环的最佳位置是为新数据创建一个
n
long uint8数组,并在与以前的数据连接之前使用循环设置其上的值。根据您的建议,我更改了
concatBytes
,如下所示。我想它会起作用的。函数concatBytes(ui8a,bytes){var b=new Uint8Array(bytes.length);bytes.forEach(函数(byte,index){b[index]=byte;});返回concattypedarray(ui8a,b);}var u8=new Uint8Array(0);//追加0x80C83B u8=concatBytes(u8[0x80,0xC8,0x3B]);//128, 200, 59]
const byte = 3;
concatenate(Uint8Array, Uint8Array.of(1, 2), Uint8Array.of(byte));