js实现bytebuffer
实现 ByteBuffer 的基本方法
在 JavaScript 中实现类似 Java 的 ByteBuffer 功能,可以通过 ArrayBuffer 和 DataView 来实现。以下是几种常见的实现方式:
使用 ArrayBuffer 和 DataView
创建一个固定大小的 ArrayBuffer,并通过 DataView 进行读写操作:
const buffer = new ArrayBuffer(16); // 16字节的缓冲区
const view = new DataView(buffer);
// 写入数据
view.setInt32(0, 42); // 在偏移量0处写入32位整数
view.setFloat64(4, 3.14); // 在偏移量4处写入64位浮点数
// 读取数据
const intValue = view.getInt32(0);
const floatValue = view.getFloat64(4);
封装为 ByteBuffer 类

将上述功能封装为一个类,提供更友好的接口:
class ByteBuffer {
constructor(size) {
this.buffer = new ArrayBuffer(size);
this.view = new DataView(this.buffer);
this.position = 0;
}
putInt(value) {
this.view.setInt32(this.position, value);
this.position += 4;
return this;
}
getInt() {
const value = this.view.getInt32(this.position);
this.position += 4;
return value;
}
putFloat(value) {
this.view.setFloat64(this.position, value);
this.position += 8;
return this;
}
getFloat() {
const value = this.view.getFloat64(this.position);
this.position += 8;
return value;
}
reset() {
this.position = 0;
}
}
// 使用示例
const bb = new ByteBuffer(16);
bb.putInt(42).putFloat(3.14);
bb.reset();
console.log(bb.getInt(), bb.getFloat());
使用 TypedArray

如果需要处理特定类型的数据,可以直接使用 Uint8Array、Int32Array 等类型化数组:
const buffer = new ArrayBuffer(16);
const intArray = new Int32Array(buffer);
intArray[0] = 42;
intArray[1] = 100;
const uint8Array = new Uint8Array(buffer);
uint8Array[8] = 255;
动态扩容的 ByteBuffer
如果需要动态调整缓冲区大小,可以扩展 ByteBuffer 类:
class DynamicByteBuffer {
constructor(initialSize = 1024) {
this.buffer = new ArrayBuffer(initialSize);
this.view = new DataView(this.buffer);
this.position = 0;
this.capacity = initialSize;
}
ensureCapacity(required) {
if (this.position + required <= this.capacity) return;
const newCapacity = Math.max(this.capacity * 2, this.position + required);
const newBuffer = new ArrayBuffer(newCapacity);
new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));
this.buffer = newBuffer;
this.view = new DataView(this.buffer);
this.capacity = newCapacity;
}
putInt(value) {
this.ensureCapacity(4);
this.view.setInt32(this.position, value);
this.position += 4;
return this;
}
// 其他方法类似...
}
处理字节序
DataView 默认使用大端字节序,可以指定小端字节序:
view.setInt32(0, 42, true); // 小端字节序
view.getInt32(0, true); // 小端读取
注意事项
- JavaScript 中的
ArrayBuffer是固定大小的,动态扩容需要创建新的缓冲区 - 使用
DataView可以精确控制字节序和数据类型 - 类型化数组 (
TypedArray) 提供了更高效的特定类型数据处理 - 注意缓冲区边界检查,避免越界访问
这些方法可以根据具体需求组合使用,实现不同复杂度的 ByteBuffer 功能。





