JS-ArrayBuffer (二)

上节对ArrayBuffer有了基本的了解,不过没提及如果读取和修改buffer里面的数据,这节主要来说说能够修改buffer的视图类

常用视图类型TypeArray:

视图类型数据类型占位数字节数有无字符
Int8Array整数81
Uint8Array整数81
Int16Array整数162
Uint16Array整数162
Int32Array整数324
Uint32Array整数324
Float32Array 浮点数324\
Float64Array 浮点数648\

 

 

 

 

 

 

 

 

.

单个试图类占用字节数:可以使用试图类的静态属性可以获取:bytesLen = Int8Array.BYTES_PER_ELEMENT

所以一个试图类对象占用字节数为:bytes = 长度 * bytesLen;

TypeArray构造函数:

1.传入一个长度length

//传入长度,创建后默认 0000 0000 | 0000 0000
var int8a = new Int8Array(2);
//0 0 
console.log(int8a[0], int8a[1]);

2.传入一个buffer

//0000 0000 | 0000 0000
var buffer = new ArrayBuffer(2);

//如果传入buffer的长度不是2的倍数,则会报错
var int16a = new Int16Array(buffer);
var int8a = new Int8Array(buffer);

//0000 0000 | 0000 0001
int16a[0] = 1;
//越界处理不会报错 //0000 0000 | 0000 0001 || 0000 0000| 0000 0002
int16a[1] = 2;
console.log(int16a[1]);


// log 1 由于字节序为小端,所以int8a[0] 为1
console.log(int8a[0]);
//log 0
console.log(int8a[1]);

3.传入buffer, start,length

var buffer = new ArrayBuffer(32);

//1*2 = 2字节:0-1
var int8a = new Int8Array(buffer, 0, 2);

//2*3 = 6字节:2-7
var int16a = new Int16Array(buffer, 2, 3);

//4*4=16字节:8-23
var int32a = new Int32Array(buffer, 8, 4);

//此处会报错
var int32a2 = new Int32Array(buffer, 30, 3);

4.传入一个object

var int8a = new Int8Array([1, 2, 3, 4, 5]);

console.log(int8a[0]);

如果两个视图对象同时处理同一个buffer,而且处理的buffer的相同字节,则改字节数据储存的是,最后修改为的数据

如下面例子:

//创建了一个8字节的buffer
var buffer = new ArrayBuffer(8);

var int8a = new Int8Array(buffer, 0, 4);
var int16a = new Int16Array(buffer, 2, 1);

int8a[2] = 83;
int8a[3] = 84;

console.log(int8a[2]);  // 83
console.log(int8a[3]);  // 84

//和int8a修改了buffer的第3,4个字节
int16a[0] = 256;

console.log(int16a[0]); // 256 
console.log(int8a[2]);  // 0
console.log(int8a[3]);  // 1


//分析:int16把第3,4个字节修改为了 0001 0000
//但是为什么int8a[2] == 0 而 int8a[3] == 1呢
//这是因为我使用的机器是小端字节序,当它修改int16时按照小端来写入 0000 0001

字节序在另外的文章有提及,这里顺便提一下,数据的存储内容是不知道什么是大小端的,你存什么它就是什么(比如上面的256为小端0000 0001,还是大端0001 0000),只有存的时候,或者取的时候才有字节序的说法,用大端的方法存,就大端的方法取,那么取出来的数据就是对的,反则会造成数据出错

视图的常用方法和属性:

var buffer = new ArrayBuffer(8);

var view = new Int8Array(buffer);

view.buffer        //传入buffer的引用
view.byteLength    //占用字节的数量
view.byteOffset    //在buffer中的偏移位
view.length
view.set([1,2,3], 3);//改写数据为[0,0,0,1,2,3,0,0];
view.subarray(1,4);

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值