博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTML5 ArrayBufferView之DataView
阅读量:5988 次
发布时间:2019-06-20

本文共 2904 字,大约阅读时间需要 9 分钟。

DataView视图

如果一段数据包括多种类型(比如服务器传来的HTTP数据),这时除了建立ArrayBuffer对象的复合视图以外,还可以通过DataView视图进行操作。

DataView视图提供更多操作选项,而且支持设定字节序。本来,在设计目的上,ArrayBuffer对象的各种类型化视图,是用来向网卡、声卡之类的本机设备传送数据,所以使用本机的字节序就可以了;而DataView的设计目的,是用来处理网络设备传来的数据,所以大端字节序或小端字节序是可以自行设定的。

DataView本身也是构造函数,接受一个ArrayBuffer对象作为参数,生成视图。

DataView(ArrayBuffer buffer [, 字节起始位置 [, 长度]]);

下面是一个实例。

var buffer = new ArrayBuffer(24);var dv = new DataView(buffer);

实例2: 使用DataView还可以避免一些异常

//将字符串转换成 Blob对象var blob = new Blob(['中文字符串'], {    type: 'text/plain'});//将Blob 对象转换成 ArrayBuffervar reader = new FileReader();reader.readAsArrayBuffer(blob);reader.onload = function (e) {    console.info(reader.result); //ArrayBuffer {}    //经常会遇到的异常 Uncaught RangeError: byte length of Int16Array should be a multiple of 2    //var buf = new int16array(reader.result);    //console.info(buf);    //将 ArrayBufferView  转换成Blob    var buf = new DataView(reader.result);    console.info(buf); //DataView {}    reader.readAsText(new Blob([buf]), 'utf-8');    reader.onload = function () {        console.info(reader.result); //中文字符串    };}

DataView视图提供以下方法读取内存:

  • getInt8:读取1个字节,返回一个8位整数。
  • getUint8:读取1个字节,返回一个无符号的8位整数。
  • getInt16:读取2个字节,返回一个16位整数。
  • getUint16:读取2个字节,返回一个无符号的16位整数。
  • getInt32:读取4个字节,返回一个32位整数。
  • getUint32:读取4个字节,返回一个无符号的32位整数。
  • getFloat32:读取4个字节,返回一个32位浮点数。
  • getFloat64:读取8个字节,返回一个64位浮点数。

这一系列get方法的参数都是一个字节序号,表示从哪个字节开始读取。

var buffer = new ArrayBuffer(24);var dv = new DataView(buffer);// 从第1个字节读取一个8位无符号整数var v1 = dv.getUint8(0);// 从第2个字节读取一个16位无符号整数var v2 = dv.getUint16(1); // 从第4个字节读取一个16位无符号整数var v3 = dv.getUint16(3);

上面代码读取了ArrayBuffer对象的前5个字节,其中有一个8位整数和两个十六位整数。

如果一次读取两个或两个以上字节,就必须明确数据的存储方式,到底是小端字节序还是大端字节序。默认情况下,DataView的get方法使用大端字节序解读数据,如果需要使用小端字节序解读,必须在get方法的第二个参数指定true。

// 小端字节序var v1 = dv.getUint16(1, true);// 大端字节序var v2 = dv.getUint16(3, false);// 大端字节序var v3 = dv.getUint16(3);

DataView视图提供以下方法写入内存:

  • setInt8:写入1个字节的8位整数。
  • setUint8:写入1个字节的8位无符号整数。
  • setInt16:写入2个字节的16位整数。
  • setUint16:写入2个字节的16位无符号整数。
  • setInt32:写入4个字节的32位整数。
  • setUint32:写入4个字节的32位无符号整数。
  • setFloat32:写入4个字节的32位浮点数。
  • setFloat64:写入8个字节的64位浮点数。

这一系列set方法,接受两个参数,第一个参数是字节序号,表示从哪个字节开始写入,第二个参数为写入的数据。对于那些写入两个或两个以上字节的方法,需要指定第三个参数,false或者undefined表示使用大端字节序写入,true表示使用小端字节序写入。

// 在第1个字节,以大端字节序写入值为25的32位整数dv.setInt32(0, 25, false); // 在第5个字节,以大端字节序写入值为25的32位整数dv.setInt32(4, 25); // 在第9个字节,以小端字节序写入值为2.5的32位浮点数dv.setFloat32(8, 2.5, true);

如果不确定正在使用的计算机的字节序,可以采用下面的判断方式。

var littleEndian = (function() {  var buffer = new ArrayBuffer(2);  new DataView(buffer).setInt16(0, 256, true);  return new Int16Array(buffer)[0] === 256;})();

如果返回true,就是小端字节序;如果返回false,就是大端字节序。

属性:

 Read onlyThe  referenced by this view. Fixed at construction time and thus read only.

 

Read onlyThe length (in bytes) of this view from the start of its . Fixed at construction time and thus read only.

 

Read onlyThe offset (in bytes) of this view from the start of its . Fixed at construction time and thus read only.

更多类型化数组:

更多DataView:

转载地址:http://dynlx.baihongyu.com/

你可能感兴趣的文章
ubuntu apt-get 出现NO_PUBKEY的解决方案
查看>>
PL\SQL中对数据库操作后没有改变
查看>>
MAC地址与ARP协议
查看>>
Java的新项目学成在线笔记-day6(七)
查看>>
时区大全列表
查看>>
脚本安装Discuz论坛(shell + Python 实现自动化安装)
查看>>
pcb线宽对信号的影响怎么处理?
查看>>
MapReduce阶段源码分析以及shuffle过程详解
查看>>
centos7 Mariadb 安装 与 二进制编译安装
查看>>
Linux文件、用户、组
查看>>
详解文件存储结构
查看>>
发展负责任的人工智能
查看>>
JavaScript的一道加法题?
查看>>
毕马威:应用于新一代智能汽车的芯片成为研发重点
查看>>
大数据学习之小白快速了解flume
查看>>
Android 组件宽度高度自适应
查看>>
oracle技术之oracle归档模式下的Rman备份集在异机恢复
查看>>
ASM 磁盘、目录的管理
查看>>
Oracle 11g RAC CRS-4535/ORA-1507
查看>>
Javascript你必须要知道的面试题
查看>>