前端对于 ArrayBuffer 操作有两种方式,TypeArray 和 DataView。对于各个字节序的读取没有 Node 原生的 Buffer 对象方便。

常用的操作有:

  • 对bit单元的操作
  • 对字节/ 字节序的操作

对字节/ 字节序的操作

读取字节、字节序

/**
 * 读取32位大端字节序
 */
function readUInt32BE(buffer: ArrayBuffer, offset: number) {
  return new DataView(buffer, offset).getInt32(0, false);
}
 
/**
 * 读取24位大端字节序
 */
function readUInt24BE(buffer: ArrayBuffer, offset: number) {
  const arr = new Uint8Array(buffer);
  return (arr[offset] << 16) | (arr[offset + 1] << 8) | arr[offset + 2];
}
 
/**
 * 读取16位大端字节序
 */
function readUInt16BE(buffer: ArrayBuffer, offset: number) {
  return new DataView(buffer, offset).getInt16(0, false);
}
 
/**
 * 读取8位大端字节序
 */
function readUInt8(buffer: ArrayBuffer, offset: number) {
  const arr = new Uint8Array(buffer);
  return arr[offset];
}

写入字节流

// 申请一个byteLength长度arraybuffer空间
const typeArray = new Uint8Array(byteLength);
// 将newBuffer插入到arraybuffer空间中的offset位置
typeArray.set(new Uint8Array(newBuffer), offset);

复制字节流

let a = new Uint8Array([1,2,3,4,5,6]);
let c = a.slice(0, 5);

共享字节流

let a = new Uint8Array([1,2,3,4,5,6]);
let b = a.subarray(0, 5);

对 bit 的操作

// 获取一个字节的前4个bit
readUInt8(buffer, 0) & 240) >> 4;
// 获取一个字节的后4个bit
readUInt8(buffer, 0) & 15;