ArrayBuffer 入门
这篇文章主要介绍了JavaScript中的ArrayBuffer详细介绍,本文讲解了Array 在内存中的堆栈模型、原始缓冲区的创建、数据化数组、DataView对象、XHR2 中的 ArrayBuffer等内容,
ArrayBuffer 对象
相对ArrayBuffer来说,可能Array会更熟悉些。
那么ArrayBuffer是什么鬼?
Array使用单独的变量名来存储一系列的值。
ArrayBuffer对象代表储存二进制数据的一段内存。
Array
var array = new Array(32);
上面代码创建32长度的Array(当然也可以不指定长度),由于未赋值,只存储32个[undefined],Array的长度可以随意更改,存储的数据也可以随意新增或删减更改。
ArrayBuffer
var buf = new ArrayBuffer(32);
上面代码生成了一段32字节(Byte)长度的内存区域,每个字节(Byte)的默认值都是为0。
Array和ArrayBuffer只是区别存储的数据不一样,ArrayBuffer只能存储Byte数据,一但确定长度后不允许更改,由于是一段内存地址,它不能直接读写,只能通过TypeArray和DataView操作
Byte又是什么鬼?
字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。
Byte百科传送门
1 byte = 8 bit
1 bit = 0 或 1
8个bit = (00000000或11111111) 2进制 相当可存储8个bit( 0 和 1)
尝试下:
最小值是00000000 (2进制)= 0
最大值是11111111(2进制) = 255 (10进制) = 0xFF(16进制)
到这里,对于Byte,也有相关的了解了,那么Byte可以做什么?
先了解下面内容:
ASCII :
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。
标准表 来源
Bin(二进制) Oct(八进制) Dec(十进制) Hex(十六进制) 缩写/字符 解释
0000 0000 0 0 00 NUL(null) 空字符
0000 0001 1 1 01 SOH(start of headline) 标题开始
0000 0010 2 2 02 STX (start of text) 正文开始
0000 0011 3 3 03 ETX (end of text) 正文结束
0000 0100 4 4 04 EOT (end of transmission) 传输结束
… … … … … …
01111010 172 122 7A z 小写字母z
01111011 173 123 7B { 开花括号
01111100 174 124 7C | 垂线
01111101 175 125 7D } 闭花括号
01111110 176 126 7E ~ 波浪号
01111111 177 127 7F DEL (delete) 删除
双字节
解决中国、日本和韩国的象形文字符和ASCII的某种兼容性。
比如“你”字,占用两个字节
100111101100000 = 20320(10进制) = 0x4f60 (16进制) = \u4f60 (Unicode )
输出:
当然也有每个国家发布的标准,像中国GB2312、GBK等
还有国际标准的Unicode
像UTF-8 等 想了解更多可以进入传送门
不同的编码存储,读取的方式也不一样,所以有些不同编码读取的时候引起的乱码就是基于这个原因,像UTF-8,GB2312,BGK。
byte怎么存储数据?
数据类型 字节长度 含义 对应的C语言类型
Int8 1 8位带符号整数 signed char
Uint8 1 8位不带符号整数 unsigned char
Uint8C 1 8位不带符号整数(自动过滤溢出) unsigned char
Int16 2 16位带符号整数 short
Uint16 2 16位不带符号整数 unsigned short
Int32 4 32位带符号整数 int
Uint32 4 32位不带符号的整数 unsigned int
Float32 4 32位浮点数 float
Float64 8 64位浮点数 double
可存储的值
int8 带符号 -128~127
uint8 无符号 0~255
int16 带符号 -32768~32767
uint16 无符号 0~65535
int32 有符号 -2147483648~2147483647
uint32 无符号 0~4294967295
Float32和Float64,区别在于精度,float32又叫单精度浮点型,float64又叫做双精度浮点型。其最主要的区别就是小数点后面能跟的小数位数不同。
兼容性
—————————————————————————————————
ArrayBuffer只能存储Byte数据,一但确定长度后不允许更改,由于是一段内存地址。那么写入或读取Byte时是靠TypedArray和DataView。
ArrayBuffer只有裁剪和取得长度。
ArrayBuffer.prototype.byteLength //取得所分配内存区域的byte长度
* ArrayBuffer.prototype.slice()//拷贝生成一份新的ArrayBuffer对象 ,使用和Array一样
ArrayBuffer.isView() //返回一个布尔值,表示参数是否为ArrayBuffer的视图实例
*slice部分不支持
TypedArray:
ArrayBuffer对象作为内存区域,可以存放多种类型的数据。同一段内存,不同数据有不同的解读方式,这就叫做“视图”(view)。
TypedArray与Array操作差不多,可以直接操作byte数据
目前,TypedArray对象一共提供9种类型的视图,每一种视图都是一种构造函数
Int8Array:8位有符号整数,长度1个字节。
Uint8Array:8位无符号整数,长度1个字节。
Uint8ClampedArray:8位无符号整数,长度1个字节,溢出处理不同。
Int16Array:16位有符号整数,长度2个字节。
Uint16Array:16位无符号整数,长度2个字节。
Int32Array:32位有符号整数,长度4个字节。
Uint32Array:32位无符号整数,长度4个字节。
Float32Array:32位浮点数,长度4个字节。
Float64Array:64位浮点数,长度8个字节。
BYTES_PER_ELEMENT属性
每种视图都有一个BYTES_PER_ELEMENT属性,表示这种数据类型占位的字节数
Int8Array.BYTES_PER_ELEMENT // 1
Uint8Array.BYTES_PER_ELEMENT // 1
Int16Array.BYTES_PER_ELEMENT // 2
Uint16Array.BYTES_PER_ELEMENT // 2
Int32Array.BYTES_PER_ELEMENT // 4
Uint32Array.BYTES_PER_ELEMENT // 4
Float32Array.BYTES_PER_ELEMENT // 4
Float64Array.BYTES_PER_ELEMENT // 8
构造函数:
new (type)Array(buffer,offset,length);
*type等于int8,int32等
例如:int32
var a = new ArrayBuffer(4);
var type = new Int32Array(a);
或int8
var a = new ArrayBuffer(1);
var type = new Int8Array(a);
从指定位置
var a = new ArrayBuffer(6);var type = new Int8Array(a); 从a第1位开始 长度6byte
var type1 = new Int8Array(a,2); 从a第3位开始 长度4byte
var type2 = new Int8Array(a,4,1);从a第5位开始,占据长度为1 byte
函数
Array数组的操作方法和属性,对TypedArray数组完全一样
TypedArray.prototype.copyWithin(target, start[, end = this.length])
TypedArray.prototype.entries()
TypedArray.prototype.every(callbackfn, thisArg?)
TypedArray.prototype.fill(value, start=0, end=this.length)
TypedArray.prototype.filter(callbackfn, thisArg?)
TypedArray.prototype.find(predicate, thisArg?)
TypedArray.prototype.findIndex(predicate, thisArg?)
TypedArray.prototype.forEach(callbackfn, thisArg?)
TypedArray.prototype.indexOf(searchElement, fromIndex=0)
TypedArray.prototype.join(separator)
TypedArray.prototype.keys()
TypedArray.prototype.lastIndexOf(searchElement, fromIndex?)
TypedArray.prototype.map(callbackfn, thisArg?)
TypedArray.prototype.reduce(callbackfn, initialValue?)
TypedArray.prototype.reduceRight(callbackfn, initialValue?)
TypedArray.prototype.reverse()
TypedArray.prototype.slice(start=0, end=this.length)
TypedArray.prototype.some(callbackfn, thisArg?)
TypedArray.prototype.sort(comparefn)
TypedArray.prototype.toLocaleString(reserved1?, reserved2?)
TypedArray.prototype.toString()
TypedArray.prototype.values()
————————————————————————————————–
尝试建立
//使用Array生成一个实例
var typedArray = new Uint8Array([1, 2, 3, 4]);
console.log( typedArray.buffer)// output arrayBuffer
//创建一段空ArrayBuffer
var arraybuffer = new ArrayBuffer(4)
var typedArray1 = new Uint8Array(arraybuffer );
console.log( typedArray1.buffer)// output arrayBuffer
var typedArray2 = new Uint8Array(64 );
console.log( typedArray2.buffer)// output arrayBuffer
尝试写入数据
//创建一个4 byte 长度的int8Array
var a = new Int8Array(4 );
a[0] = 0; //0x00
a[1] = 0;//0x00
a[2] = 255;//0xFF
a[3] = 255;//0xFF
//对应16进制是 0x0000FFFF
var d = new DataView(arraybuffer );
d.getInt8(0) //output 0
d.getInt8(1)//output 0
d.getInt8(2) // output -1
d.getInt8(3)//ouput -1
d.getUint8(0) //output 0
d.getUint8(1)//output 0
d.getUint8(2)//output 255
d.getUint8(3)//output 255;
d.getInt32(0) //output 65535
d.getUint32(0) //output 65535
多个视图
var buffer = new ArrayBuffer(24);
var idView = new Uint32Array(buffer, 0, 1);//字节0到字节3:1个32位无符号整数
var usernameView = new Uint8Array(buffer, 4, 16);//字节4到字节19:16个8位整数
var amountDueView = new Float32Array(buffer, 20, 1);//字节20到字节23:1个32位浮点数
DataView
一段数据包括多种类型(比如服务器传来的HTTP数据),除了建立ArrayBuffer对象的复合视图以外,还可以通过DataView视图进行操作。
未完待续。。。