zoukankan      html  css  js  c++  java
  • 二进制数组ArrayBuffer

    概述

    接口设计的原始目的,与WebGL项目有关。 所谓WebGL,就是指浏览器与显卡之间的通信接口,为了满足
    javascript与显卡之间的大量的数据、实时的数据交换,他们之间的通信必须是二进制的,而不能是传统的文本格式

    • ArrayBuffer对象 代表原始的二进制数据
    • TypedArray 用来读写简单类型的二进制数据
    • DataView 用来读写复杂的类型的二进制数据

    已知操作浏览器的API,用到了二进制数组的有

    • File API
    • XMLHttpRequest
    • Fetch API
    • Canvas
    • WebSocket

    ArrayBuffer对象

    只能通过视图(TypeArray视图和DataView视图)来读写,视图的作用是以指定的格式来解读二进制数据
    ArrayBuffer也是一个构造函数,可以分配一段存放数据的连续内存空间

    var buf = new ArrayBuffer(32); //32字节
    
    

    ArrayBuffer.prototype.byteLength

    • 返回所分配的内存区域的字节长度
    var buffer = new ArrayBuffer(32);
    console.info(buffer.byteLength); //32
    

    ArrayBuffer.prototype.slice()

    • 允许将内存区域的一部分,拷贝到一个新的ArrayBuffer对象
    var buffer = new Arraybuffer(8);
    var newBuffer = buffer.slice(0,3); // 分配一个新的内存,将原来的值赋值过去
    

    Arraybuffer.isView()

    • 静态方法isView,返回一个boolean值,表示参数是否为ArrayBuffer的视图实例
    var buffer = new ArrayBuffer(8);
    ArrayBuffer.isView(buffer); //false
    
    var v = new Int32Array(buffer);
    ArrayBuffer.isView(v); //true
    
    

    TypedArray视图

    • 一组构造函数,代表不同的数据格式

    • Int8Array 8位有符号 len = 1

    • Uint8Array 8位无符号 len = 1

    • Unit8ClampedArray 8位无符号整数,len = 1,溢出处理不同

    • Int16Array 16位有符号 len = 2

    • Uint16Array 16位无符号 len = 2

    • Int32Array(buffer); 32位有符号 len = 4

    • UnitArray(buffer); 32位无符号 len = 4

    • Float32Array 32位浮点数 len = 4

    • Float64Array 64位浮点数 len = 8

    • 构造方式

    • TypedArray(buffer, byteOffset, length?);

    var b = new ArrayBuffer(8);
    var v1 = new Int32Array(b);
    
    var v2 = new Unit8Array(b, 2);
    
    var v3 = new Int16Array(b, 2, 2);
    
    • TypedArray(length)
    var abcd = new Float64Array(8);
    abcd[0] = 10;
    
    • TypedArray(typedArray)
    var typedArray = new Int8Array(new Unit8Array(8));
    
    • TypedArray(arrayLikeObject)
    var typeArray = new Unit8Array([1,2,3,4,5]);
    

    复合视图

    • 由于视图的构造函数可以指定起始位置和长度,所以在同一段内存中,可以依次存放不同类型的数据
    var buffer = new ArrayBuffer(24);
    
    var idView = new Int32Array(buffer, 0, 1);
    var nameVidw = new Int32Array(buffer, 4, 1);
    var ageVidw = new Int32Array(buffer, 8, 1);
    

    DataView视图

    • DataView 视图本身也是构造函数,,接受一个ArrayBuffer对象作为参数,生成视图
       DataView(ArrayBuffer buffer[, 字节起始位置 [, 长度]])
    
    • 大端字节序读取与小端字节序读取不同; 默认是大端字节序读取数据
    • dv.getUint16(1, true) // 小端
    • dv.getUint16(3, false) // 大端

    二进制数组的应用

    ajax, canvas, file, websocket, fetch

    var canvas = document.getElmentById('myCanvas');
    var ctx = canvas.getContext('2d');
    
    var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
    var uint8ClampedArray = imageData.data;
    
    uint8ClampedArray 类型专门针对颜色,把每个字节解读成无符号的8位整数,即只能取值0~255,
    而且发生运算的时候自动过滤高位溢出; 即超过255,处理结果为255, 小于0处理结果为0
    
  • 相关阅读:
    IDEA右键新建时没有Java Class选项
    捕获摄像头视频VC
    重叠IO与IOCP
    (八)内存管理与内存分配
    DebugView使用详解
    (六) 中断机制
    (五) proc文件系统
    bash 之备份文件
    bash 遍历目录文件
    (四) linux内核模块编程
  • 原文地址:https://www.cnblogs.com/pengsn/p/12954815.html
Copyright © 2011-2022 走看看