如何不通过拷贝实现ArrayBuffer切片,拆分不同类型二进制数据
无拷贝拆分二进制数据的实现方法
你可以直接基于同一份底层ArrayBuffer创建不同类型的TypedArray视图,完全不需要拷贝数据。TypedArray本身只是内存的访问层,不会持有独立的数据副本,所有视图的修改都会直接作用到底层的同一块内存上。
具体实现步骤
- 首先确认你的原始二进制数据存储在
ArrayBuffer对象中,如果当前拿到的是其他TypedArray实例,可通过其.buffer属性获取底层的ArrayBuffer - 计算拆分偏移量,注意偏移量需要和对应TypedArray的元素字节数对齐:
Uint32Array每个元素占4字节,BigInt64Array每个元素占8字节,因此拆分边界必须是8的整数倍,否则创建BigInt64Array时会抛出对齐错误 - 直接传入偏移量和长度创建两个类型的视图即可
代码示例
// 示例:原始ArrayBuffer总长度16字节,前后各8字节拆分 const rawBuffer = new ArrayBuffer(16); // 前半部分创建Uint32Array视图:偏移量0,长度2(8字节 / 4字节每元素) const uint32Part = new Uint32Array(rawBuffer, 0, rawBuffer.byteLength / 2 / Uint32Array.BYTES_PER_ELEMENT); // 后半部分创建BigInt64Array视图:偏移量8,长度1(8字节 / 8字节每元素) const bigInt64Part = new BigInt64Array(rawBuffer, rawBuffer.byteLength / 2, rawBuffer.byteLength / 2 / BigInt64Array.BYTES_PER_ELEMENT);
注意事项
- 上述两个视图完全共享
rawBuffer的内存,没有任何拷贝开销,修改任意视图的元素都会同步到另一个视图的对应位置 - 如果你的原始数据拆分边界无法满足8字节对齐要求,需要先调整原始ArrayBuffer的长度或者调整拆分规则,不要使用
slice方法(该方法会返回新的拷贝后的ArrayBuffer)
内容的提问来源于stack exchange,提问作者mihebo
相关产品推荐
相关产品推荐

