• javascript ArrayBuffer类型化数组和视图的操作


    个人理解类型化数据就是内存分配区域,不同数据的存储就是视图DataView咯

    var buffers = [];

    var json = {"id":100, "name": "中国"};
    var buf = new Buffer(JSON.stringify(json));

    定义一个ArrayBuffer

       var ab = new ArrayBuffer(6);//定义一个6字节的内存区域

       var abLength =  ab.byteLength;//6

       //检查内存分配是否成功则需要abLength做比较咯

       if(abLength === 6){ //成功 }else{ //失败 }

    ArrayBuffer可以存放多种类型的数据,而不同类型的存储方式就是DataView

    DataView的类型如下:

    • Int8Array:8位有符号整数,长度1个字节。
    • Uint8Array:8位无符号整数,长度1个字节。
    • Int16Array:16位有符号整数,长度2个字节。
    • Uint16Array:16位无符号整数,长度2个字节。
    • Int32Array:32位有符号整数,长度4个字节。
    • Uint32Array:32位无符号整数,长度4个字节。
    • Float32Array:32位浮点数,长度4个字节。
    • Float64Array:64位浮点数,长度8个字节。

    构造DataView,new DataView(ArrayBuffer); //参数必须存在,且必须是ArrayBuffer

    DataView视图提供以下方法写入内存:有三个参数第一个参数是字节序号,第二个参数为写入的数据,第三个参数则为true|false可选,true为低字节写入,默认为高字节写入

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

         一下方法读取内存

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

    //数据的存储

    var dv = new DataView(ab);

    dv.setUint16(0, Math.pow(2, 16) - 1);

    dv.setUint16(2, Math.pow(2, 16) - 2);

    dv.setUint16(4, buf.length);

    buffers.push(new Buffer(new Uint8Array(ab)));

    buffers.push(buf);

    var resBuf = Buffer.concat(buffers);//最总组合的buffer;

    //数据的解包

    var a1 = resBuf.readUInt16BE(0);//从缓存对象读取一个 16 位无符号整型数值,以高字节序的存储方式

    var a2 = resBuf.readUInt16BE(2);

    var a3 = resBuf.readUInt16BE(4);

    var str = resBuf.slice(6, a3 + 6);//取字符串内容

    最后,a1,a2,a3,str则为刚才存储的数据

  • 相关阅读:
    CentOS 设置mysql的远程访问
    centos的防火墙命令
    gorm的related理解和实例
    epoll相比select,poll的2个改进点
    limit越往后越慢,如何解决?
    LRUCache的设计,实现和调试
    map可以并发读,不能并发写
    2020年4月上旬算法讨论4(快排和堆排)
    删除链表节点代码编写复盘(从直接思路到优雅思路)
    2020年3月下寻算法讨论3(链表-下)
  • 原文地址:https://www.cnblogs.com/ajun/p/4173805.html
Copyright © 2020-2023  润新知