You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

44 lines
1.3 KiB
JavaScript

5 months ago
// utils/dynamicArrayBuffer.js
class DynamicArrayBuffer {
constructor(initialSize = 1024) {
this.buffer = new ArrayBuffer(initialSize); // 初始的ArrayBuffer
this.view = new Uint8Array(this.buffer); // Uint8Array视图用于操作ArrayBuffer
this.offset = 0; // 记录当前已写入的字节数
}
// 扩展ArrayBuffer的大小
expandBuffer(newSize) {
const newBuffer = new ArrayBuffer(newSize); // 创建新的ArrayBuffer
const newView = new Uint8Array(newBuffer); // 创建新的Uint8Array视图
// 复制旧数据到新buffer
newView.set(this.view);
// 更新当前buffer和视图
this.buffer = newBuffer;
this.view = newView;
}
// 向ArrayBuffer添加数据
appendData(data) {
const dataLength = data.length;
// 如果当前的数据空间不足扩展buffer
if (this.offset + dataLength > this.buffer.byteLength) {
let newSize = Math.max(this.buffer.byteLength * 2, this.offset + dataLength);
this.expandBuffer(newSize); // 扩展buffer
}
// 将数据写入buffer
this.view.set(data, this.offset);
this.offset += dataLength; // 更新偏移量
}
// 获取当前缓冲区的内容
getBuffer() {
return this.view.slice(0, this.offset); // 返回有效数据部分
}
}
module.exports = DynamicArrayBuffer;