前端学习(五十三) JavaScript-StructuredData(javaScript)

StructuredData

背景

web出现了越来越多与图形图像的富交互应用,例如虚拟现实技术,3D游戏等

二进制操作接口

主要有:ArrayBufferDataViewTypedArray

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,例如TypedArrayDataView对象;否则就返回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)

实例:

猜你喜欢

转载自blog.csdn.net/zy21131437/article/details/81265938