gpt4 book ai didi

javascript - 如何在 javascript 中将字节、多字节和缓冲区附加到 ArrayBuffer?

转载 作者:可可西里 更新时间:2023-11-01 01:32:15 24 4
gpt4 key购买 nike

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

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,因为最小的单位是byte,即

function concatBuffers(a, b) {
return concatTypedArrays(
new Uint8Array(a.buffer || a),
new Uint8Array(b.buffer || b)
).buffer;
}

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


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

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]

关于javascript - 如何在 javascript 中将字节、多字节和缓冲区附加到 ArrayBuffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33702838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com