ArrayBuffer

118 阅读4分钟

ArrayBuffer

ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。
它是一个字节数组,通常在其他语言中称为“byte array”。你不能直接操作 ArrayBuffer 中的内容;而是要通过类型化数组对象或 DataView 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。

静态方法

ArrayBuffer.isView()
如果 arg 是 ArrayBuffer 视图之一,则返回 true,例如类型化数组对象或者DataView。否则返回 false

实例属性

ArrayBuffer.prototype[@@toStringTag] @@toStringTag 属性的初始值是 "ArrayBuffer" 字符串。用于判断ArrayBuffer的类型、类型化数组对象和DataView上也有此属性

ArrayBuffer.prototype.byteLength
返回一个新的 ArrayBuffer,它的内容是该 ArrayBuffer 从 begin(包括)到 end(不包括)字节的拷贝。如果 begin 或 end 是负数,它则指的是从数组末尾开始的索引,而不是从头开始的索引。

示例

var buf = new ArrayBuffer(8);
var buf1 = new Int8Array(buf);
var buf2 = new DataView(buf);
console.log(ArrayBuffer.isView(buf)); // false
console.log(ArrayBuffer.isView(buf1)); //true
console.log(ArrayBuffer.isView(buf2)); //true
console.log(buf[Symbol.toStringTag]); // ArrayBuffer
console.log(buf1[Symbol.toStringTag]);// Int8Array
console.log(buf2[Symbol.toStringTag]);// DataView
console.log(buf.byteLength); // 8
console.log(buf1.byteLength); // 8
console.log(buf2.byteLength); // 8
var buf3 = buf.slice(1, 3); // begin end

var buf4 = new Int8Array([4,5,6])
console.log('buf4', buf4);
console.log('buf4.buffer', buf4.buffer);

TypedArray

一个 TypedArray 对象描述了底层二进制数据缓冲区的类数组视图。没有称为 TypedArray 的全局属性,也没有直接可用的 TypedArray 构造函数。但是,有很多不同的全局属性,其值是指定元素类型的类型化数组构造函数

类型值范围字节大小描述Web IDL 类型等价的 C 类型
Int8Array-128 到 12718 位有符号整型(补码)byteint8_t
Uint8Array0 到 25518 位无符号整型octetuint8_t
Uint8ClampedArray0 到 25518 位无符号整型(一定在 0 到 255 之间)octetuint8_t
Int16Array (en-US)-32768 到 32767216 位有符号整型(补码)shortint16_t
Uint16Array0 到 65535216 位无符号整型unsigned shortuint16_t
Int32Array-2147483648 到 2147483647432 位有符号整型(补码)longint32_t
Uint32Array0 到 4294967295432 位无符号整型unsigned longuint32_t
Float32Array-3.4E38 到 3.4E38 并且 1.2E-38 是最小的正数432 位 IEEE 浮点数(7 位有效数字,例如 1.234567unrestricted floatfloat
Float64Array-1.8E308 到 1.8E308 并且 5E-324 是最小的正数864 位 IEEE 浮点数(16 位有效数字,例如 1.23456789012345unrestricted doubledouble
BigInt64Array-263 到 263 - 1864 位有符号整型(补码)bigintint64_t (signed long long)
BigUint64Array (en-US)0 到 264 - 1864 位无符号整型bigintuint64_t (unsigned long long)

补充知识:

一字节(byte=8位2进制);(1Byte=8Bit)
8位有符号整型:最大值: 01111111 = 1+2+4+8+16+32+64 = 127;
8位无符号位整型:最大值: 011111111 = 1+2+4+8+16+32+64+128 = 255;\

对字符串进行编码解码

const unicodeString = "hello,world,你好世界";
// 对字符串进行unicode编码
function encodeByUnicode(str){
  const unicodeArray = [];
  for(let i = 0; i < str.length; i++) {
    unicodeArray.push(str.charCodeAt(i))
  }
  return unicodeArray;
}
// 解析
function parse(buffer, begin, length) {
  const buf = new Uint16Array(buffer.slice(begin, length));
  return String.fromCharCode(...buf);
}
const unicodeArray = encodeByUnicode(unicodeString);
console.log('encodeByUnicode', unicodeArray);
console.log('encodeByUnicode.length', unicodeArray.length);
const unit16ArrayBuffer = new Uint16Array(unicodeArray);
console.log(parse(unit16ArrayBuffer, 0, 1)); // h
console.log(parse(unit16ArrayBuffer, 1, 2)); // e
console.log(parse(unit16ArrayBuffer, 2, 3)); // l
console.log(parse(unit16ArrayBuffer, 3, 4)); // l
console.log(parse(unit16ArrayBuffer, 4, 5)); // o
console.log(parse(unit16ArrayBuffer, 5, 6)); // ,
console.log(parse(unit16ArrayBuffer, 6, 7)); // w
console.log(parse(unit16ArrayBuffer, 7, 8)); // o
console.log(parse(unit16ArrayBuffer, 8, 9)); // r
console.log(parse(unit16ArrayBuffer, 9, 10)); // l
console.log(parse(unit16ArrayBuffer, 10, 11)); // d
console.log(parse(unit16ArrayBuffer, 11, 12)); // ,
console.log(parse(unit16ArrayBuffer, 12, 13)); // 你
console.log(parse(unit16ArrayBuffer, 13, 14)); // 好
console.log(parse(unit16ArrayBuffer, 14, 15)); // 世
console.log(parse(unit16ArrayBuffer, 15, 16)); // 界
console.log('全部解码:', String.fromCharCode(...unicodeArray));