5.0 DataView使用说明

1、ArrayBuffer

var buffer = new ArrayBuffer(2);
//向内存申请5个字节的空间,一个字节占8位,也就是2*8=16位

2、DataView

var dataview = new DataView(buffer);//创建dataview视图指向该内存区域
dataview.setInt8(0,'100')
dataview.setInt8(1,'104')
//100和104二进制均是8位
console.log(dataview.getInt8(0))
console.log(dataview.getInt8(1))
//所以根据偏移量能够输出100和104

如果使用setInt8存储位数大于8位的数字会如何呢?

/**
如代码,申请了2个字节的内存空间
第一个字节存了正好8位的数字
第二个字节存的是9位的数字300
最后偏移一个字节量,输出的是44
*/
var buffer = new ArrayBuffer(2);
var dataview = new DataView(buffer);
dataview.setInt8(0,'100')
dataview.setInt8(1,'300')
console.log(dataview.getInt8(1))

如图所示

100 = 1100100

300 = 100101100

 第二个字节只有8位的空间,300却有9位,存储会从低位到高位,多出来的就会舍去,故300存在第二个字节中的实际二进制应该如下,所以第二个字节取出来的是44

 如果第二个字节打头的是1,则取出来的是负数,如

var buffer = new ArrayBuffer(2);
var dataview = new DataView(buffer);
dataview.setInt8(0,'100')
dataview.setInt8(1,'200')
console.log(dataview.getInt8(1))
//output:-56

200的二进制是11001000,内存存储如下图所示

 字节开始的首位是符号位,所以在取第二个字节的值时,取的是后七位

当值为负数时,最后的值是补码的值

补码 = -(反码(10进制)+1)

即后7位的反码为0110111,转为10进制为55,根据公式加1,前面加个负号,即为-56

如果申请了1字节的空间,却要存2个字节的数据,则会报错溢出

 如果申请了2个字节的空间,存的数据只用了8位,那么该数据在内存中是怎么样存储的呢?

如下

var buffer = new ArrayBuffer(2);
var dataview = new DataView(buffer);
dataview.setInt16(0,'100')
console.log(dataview.getInt16(0))
console.log(dataview.getInt8(1))

内存中如下图

 由于是以16位的方式将100存储在2个字节中,所以应该从低位到高位,因此使用gitInt8()获取值时,需要偏移一个字节量 

其他格式区别

Int8Array:8位有符号整数,长度1个字节
Uint8Array:8位无符号整数,长度1个字节
Uint8ClampedArray:8位无符号整数,长度1个字节,溢出处理不同
Int16Array:16位有符号整数,长度2个字节
Uint16Array:16位无符号整数,长度2个字节
Int32Array:32位有符号整数,长度4个字节
Uint32Array:32位无符号整数,长度4个字节
Float32Array:32位浮点数,长度4个字节
Float64Array:64位浮点数,长度8个字节

3、汉字及字母等的 ascll码均为数字,那么我们就可以理解它们是如何在内存中存储的了

let a = 'hello world'

var buffer = new ArrayBuffer(11);
var dataview = new DataView(buffer);
let array = Array.from(a,x => x.charCodeAt())
//转成ascll码
for(let i in array){
  dataview.setInt8(i,array[i])//存储
}
let str ='' ;
//取值
for(let i = 0;i<array.length;i++){
   let temp = String.fromCharCode(dataview.getInt8(i))
   str += temp;
}
console.log(str)

//output:hello world

一个字符,占据多少个字节,完全可以从它的ascll码确定,当然,也可以用更多的字节来存储,诸如不同的编码方式,字符的占据字节也不一样

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值