StructuredData
背景
web出现了越来越多与图形图像的富交互应用,例如虚拟现实技术,3D游戏等
二进制操作接口
主要有:ArrayBuffer,DataView,TypedArray
ArrayBuffer
主要代表了存储二进制数据的一段内存,不能直接进行读写,但是可以通过视图进行读写
创建
new ArrayBuffer(length)
- ArrayBuffer对象用来表示通用的,固定长度的原始二进制数据缓冲区
- ArrayBuffer不能直接操作,而是通过TypedArray对象或者DataView对象来操作,因此,TypedArray和DataView也称做是ArrayBuffer的的视图
参数:length是要创建的ArrayBuffer的大小,单位为字节
如果length大于Number,MAX_SAFE_INTEGER(>=2^53)或者为负数,则抛出一个RangeError异常
原型上的方法:
ArrayBuffer.isView(arg)
如果参数是ArrayBuffer的视图实例则返回true,例如TypedArray或DataView对象;否则就返回false
var buffer=new ArrayBuffer(8) //新建一个长度为8的缓存区域 console.log(ArrayBuffer.isView(buffer)) //false,上面写了ArrayBuffer不能直接读写,需要通过视图来读写 var v=new Int8Array(buffer); console.log(ArrayBuffer.isView(v)) //true
ArrayBuffer实例
ArrayBuffer.prototype.constructor
指定函数,它穿件了一个对象原型。其初始值是标准ArrayBuffer内置构造函数
ArrayBufer.prototype.byteLength
数组的字节大小,在数组创建时确定,并且不可变更,只读
ArrayBuffer.protoType.slice()
返回一个新的ArrayBuffer,他的内容是这个ArrayBuffer的字节副本,从begin(开始)到end(不包括)。如果Begin或end是负数,则指的是从数组末尾开始的所有,而不是从头开始
DataView
创建
new DataView(buffer,byteOffset,byteLength)
- buffer:buffer对象
- byteOffset:字节偏移量
- byteLength:字节长度
var buffer=new ArrayBuffer(8) //新建一个长度为8的缓存区域 var date=new DataView(buffer) console.log(date.constructor) //DataView()构造函数 console.log(date.byteLength) //8 console.log(date.byteOffset) //0 console.log(date.buffer) //ArrayBuffer(8) {}
读
DataView.prototype.getInt8(byteOffset[,littleEndian])
从DataView起始位置以byte为计数的指定偏移量(byteOffset)出获取一个8-bit数(littleEndian,也就是一个字节)
注:这个字节分大端字节序和小端字节序,如果littleEndian-true,就是一个小端字节序,如果没有传,或者是false,那么就是一个大端字节序
与此相同的还有
DataView.prototype.getUint8(byteOffset[,littleEndian]) 8-bit数(无符号字节)
DataView.prototype.getInt16(byteOffset[,littleEndian]) 16-bit数(短整型)
DataView.prototype.getUnit16(byteOffset[,littleEndian]) 16-bit数(无符号短整型)
DataView.prototype.getInt32(byteOffset[,littleEndian]) 32-bit数(长整型)
DataView.prototype.getUint32(byteOffset[,littleEndian]) 32-bit数(无符号长整型)
DataView.prototype.getFloat32(byteOffset[,littleEndian]) 32-bit数(浮点型)
DataView.prototype.getFloat64(byteOffset[,littleEndian]) 64-bit数(双进度浮点型)
写
DataView.prototype.setInt8(byteOffset[,littleEndian])
从DataView起始位置以byte为计数的指定偏移量(byteOffset)出存储一个8-bit数(一个字节),
注:这个字节分大端字节序和小端字节序,如果littleEndian-true,就是一个小端字节序,如果没有传,或者是false,那么就是一个大端字节序
与此相同的还有
DataView.prototype.setUint8(byteOffset[,littleEndian]) 8-bit数(无符号字节)
DataView.prototype.setInt16(byteOffset[,littleEndian]) 16-bit数(短整型)
DataView.prototype.setUnit16(byteOffset[,littleEndian]) 16-bit数(无符号短整型)
DataView.prototype.setInt32(byteOffset[,littleEndian]) 32-bit数(长整型)
DataView.prototype.setUint32(byteOffset[,littleEndian]) 32-bit数(无符号长整型)
DataView.prototype.setFloat32(byteOffset[,littleEndian]) 32-bit数(浮点型)
DataView.prototype.setFloat64(byteOffset[,littleEndian]) 64-bit数(双进度浮点型)
字节序
大端字节序:从大端开始存储
例如:存储0x12345678和0x11223344,那么大端字节序会按如下数序存储0x12,0x34,0x56,0x78和0x11,0x22,0x33,0x44
小端字节序:从小端开始存储
存储0x12345678和0x11223344,那么小端字节序会按如下数序存储0x78,0x56,0x34,0x12和0x44,0x33,0x22,0x11
判断字节序
var l=(function () { var buffer=new ArrayBuffer(2); var v=new DataView(buffer); v.setInt16(0,256,true) //设置值时使用小端字节序 //Int16Array 使用系统字节序,有次可以判断系统是否是小段字节序 return new Int16Array(buffer[0]) === 256 })(); console.log(l)
实例: