位域 内存 字节序_JS操作内存?二进制数组了解一下
二进制数组的由来
主要是为了提高浏览器与显卡之间的通信效率,由二进制数据代替传统的文本。
二进制数组主要有三个对象:
- ArrayBuffer
- TypedArray
- DataView
ArrayBuffer对象
ArrayBuffer是一个构造函数,参数是一个数字,代表索取多少个字节的内存。例如:
var buffer = new ArrayBuffer(12);
代表生成12个字节的内存区域。
注意:ArrayBuffer对象本身并不能直接对生成的内存区域进行读写(除了slice方法),需要借助视图TypedArray和DataView来对其进行读写。
三个方法:
- 实例方法byteLength,返回生成内存的字节大小
- 实例方法slice,这个方法和数组类似,就是生成一段新的内存,并填充拷贝的内容
- 静态方法isView,是否是视图

demo1
TypedArray的用法
这种类型的视图总共有9种构造函数:
- Int8Array 8位 有符号 一个字节 整数
- Uint8Array 8位 无符号 一个字节 整数
- Uint8ClampedArray 8位 无符号 一个字节 整数
- Int16Array 16位 有符号 两个字节 整数
- Uint16Array 16位 无符号 两个字节 整数
- Int32Array 32位 有符号 四个字节 整数
- Uint32Array 32位 无符号 四个字节 整数
- Float32Array 32位 四个字节 浮点数
- Float64Array 64位 八个字节 浮点数
用法1:
new TypedArray(buf, start, length)
- buf ArrayBuffer对象
- start开始的位置,默认是0
- length 字节的长度 相对于这种数据类型的长度
用法2:
new TypedArray(length)
直接传入一个长度,生成一段内存区域
用法3:
new TypedArray(typedArray对象)

demo2
demo2中x和y视图并没有共享内存,如果想共享视图可以这样(传入实例的buffer属性):

demo3
用法4:
new TypedArray(普通的数组)

demo4
demo4中操作typedArray不会使aa发生变化,说明它们没有共用同一段内存。
TypedArray的数值
二进制数组采用小端字节序,数组前面的元素的位相对较低,越往后越高,比如demo5中32这个元素就没有后面0的元素位高,转化成16进制应该是0x0000000000000020,如果采用16位或者32位视图,再对应将其划分。

demo5
小端字节序:低位在前,高位在后;
大端字节序:高位在前,低位在后;
TypedArray的数值溢出
什么是溢出呢?看下图:

demo6
我们创建了一个Uint8Array视图,它每一个元素的最大值是255(8位),最小值是0,当给定的数值不在这个区间内时,就会发生溢出!从demo6中我们给第一个元素赋值5000,但显示的却是136,这种现象就叫做溢出。
那么溢出的规则是什么?经过我的摸索得出了几条规律!
无符号(先利用Uint8Array说明)
Uint8Array最大值255(max),最小值0(min),区间长度256(L),给其一个元素赋值m,最终显示的值是n(例子见demo7)
//无符号最小值都是0if(m >= min){ //正向溢出 n = m%L } if (m < min) { //负向溢出,m是负数 n = L + m%L}

demo7
有符合(先利用Int8Array说明)
Int8Array最大值127(max),最小值-128(min),区间长度256(L),给其一个元素赋值m,最终显示的值是n(例子见demo8)
余数y = m%L//正向溢出(m是正数)if (y <= max) { n = y} if (y > max) { n = y - L}//负向溢出(此时y,min都是负数)if (y >= min) { n = y}if (y < min) { n = L + y}

demo8
DataView对象
DataView对象和TypedArray对象最大的区别是可以自定义大端字节序还是小端字节序!
用法:
var buf = new ArrayBuffer(n);var dv = new DataView(buf, 字节起始位置, 长度);//查看demo6

demo9
8个get方法:
- getInt8:读取1个字节,返回一个8位整数。
- getUint8:读取1个字节,返回一个无符号的8位整数。
- getInt16:读取2个字节,返回一个16位整数。
- getUint16:读取2个字节,返回一个无符号的16位整数。
- getInt32:读取4个字节,返回一个32位整数。
- getUint32:读取4个字节,返回一个无符号的32位整数。
- getFloat32:读取4个字节,返回一个32位浮点数。
- getFloat64:读取8个字节,返回一个64位浮点数。
//使用样例dv.getXX(第几个字节,大端字节序(false)/小端字节序(true))
8个set方法:
- setInt8:写入1个字节的8位整数。
- setUint8:写入1个字节的8位无符号整数。
- setInt16:写入2个字节的16位整数。
- setUint16:写入2个字节的16位无符号整数。
- setInt32:写入4个字节的32位整数。
- setUint32:写入4个字节的32位无符号整数。
- setFloat32:写入4个字节的32位浮点数。
- setFloat64:写入8个字节的64位浮点数。
//使用样例dv.setXX(第几个字节,数据, 大端字节序(false)/小端字节序(true))
总结
其实二进制数组在平时工作中并不常用,甚至不常见,不过还是有必要了解一下的!因为它是buffer的基础,所以在研究buffer之前先了解一下!因为根据我的测试,自己摸索出了一个通用的规则,帮助大家理解,大家也可以帮我验证,大家有想法的也可以留言给我补充!
喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!
相关文章:

求排列的逆序数(分治)
考虑1,2,…,n (n < 100000)的排列i1,i2,…,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序。 一个排列含有逆序的个数称为这个排列的逆序数。例如排列 263451 含…

mysql 查看当前事务id,MySQL 如何查询当前最新事务ID
写在前面:在个别时候可能需要查看当前最新的事务 ID,以便做一些业务逻辑上的判断(例如利用事务 ID 变化以及前后时差,统计每次事务的响应时长等用途)。通常地,我们有两种方法可以查看当前的事务 ID:1、执行 SHOW ENGIN…

password
pwdText wx.TextCtrl(panel, -1, ”password”, size(175, -1), stylewx.TE_PASSWORD)转载于:https://www.cnblogs.com/chengxuyuan326260/p/6364695.html

java 自带thread分析工具_java自带的jvm分析工具
这段时间觉得很有必要对java的内存分析工具进行熟悉,这样以后出现机器负载较高,或者反应很慢的时候,我就可以查找原因了。上网搜了搜,发现下面这些是比较常用的,然后我在机器上试试了,把结果也贴出来哈。1.…

Python笔记:字典的fromkeys方法创建的初始value同内存地址问题
dict中的fromkeys()函数可以通过一个list来创建一个用同一初始value的dict。 1 d dict.fromkeys(["苹果", "菠萝"], [apple, pineapple]) 2 print(d) 3 d.get("苹果").append(orange) 4 print(d){苹果: [apple, pineapple], 菠萝: [apple, pine…

表格下划线怎么加粗_这招高!Excel签名栏的下划线随列宽变化,是不是感觉牛哄哄的?...
职场牛人的世界总有各种高招,随手蹦出,令人赞叹不已!今天早上去填一个表格,在输入签名时,突然发现签名处的下划线是随着列宽的变化而自动变化,这绝对是动态的,这是怎么做到的呢?我特…

JS高级程序设计拾遗
《JavaScript高级程序设计(第三版)》反反复复看了好多遍了,这次复习作为2017年上半年的最后一次,将所有模糊的、记不清的地方记录下来,方便以后巩固。 0. <script>元素属性 async表示立即下载脚本,但…

mysql建立高效索引,如何知道你建立的MySQL索引是高效,合理的
不管是开发人员,仍是数据库维护人员,给表建立索引是很常见的事情。普通到什么程度,初级,中级开发人员的印象中,只要写的sql语句效率不高,第一反应就是建索引,而无论这个字段是否适合建立索引。反…

32位java 最大内存_【答疑系列】为什么32位系统只支持最大4G内存?
这个问题一直都有同学问到,算是提问次数最多的问题之一了。32位是什么现在主流的操作系统都是64位的,早期存在32位操作系统,相信大家也都有所听闻,其实,在更早之前,还有16位、8位的,这里就不展开…

新手C#string类常用函数的学习2018.08.04
ToLower()用于将字符串变为小写,注意字符串的不可变特性,需要重新赋值给另一个字符串变量。 s s.ToLower();//字符串具有不可变性,转换后需要重新赋值,不可仅有s.ToLower(); 这可以使用户的输入不区分大小写,例如验证…

开始使用博客了,改变从这里开始。
开始使用博客了,改变从这里开始。 开始使用博客了,改变从这里开始。 开始使用博客了,改变从这里开始。转载于:https://www.cnblogs.com/hello001/p/6367259.html

php 贝瑟尔曲线,贝塞尔曲线的应用详解
简介贝塞尔曲线是可以做出很多复杂的效果来的,比如弹跳球的复杂动画效果,首先加速下降,停止,然后弹起时逐渐减速的效果。使用贝塞尔曲线常用的两个网址如下:缓动函数:cubic-bezier:如何用贝塞尔…

区别 eks_sport 和 exercise 有什么区别?看完你就清楚了!
说到“运动”sport 这个单词应该是不少人看到“运动”的第一反应吧sport /spɔ:t/ n.体育运动例如:Id say football is my favourite sport.我最喜欢的运动要数足球了。习语:be a sport 讲交情例如:Shes a good sport.她很讲交情。sport通常指…

java gps时间转换工具_java 时间戳和时间互转工具 和 时间偏移量计算
时间互转代码片段:* 时间戳 转 时间 ** param beginDate* return* see [类、类#方法、类#成员]*/public static String timeStampToTime(String beginDate){SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date new Date(Long…

tcp 状态转换.
命令行:rootubuntu:/home/linson# netstat -apt | grep 3030 server,listen 服务端根据端口生成一个socket.用于监听连接.也就是监听3次握手,当3次握手成功,建立一个连接接放入队列中. 也就是说执行了listen,会自动应答3次握手,如果不执行listen,没有api会帮你处理3次握手. 所以…

增加、修改、删除
第一;,models.py建表 from django.db import models# Create your models here.class Book(models.Model): #必须继承models.Model这个类,jango才能识别Book是一张表namemodels.CharField(max_length20)#charfield字符串类型,长度20#pricemodels.FloatFi…

java ee 笔试题目,JSP经典笔试@题目(含答案)
JSP经典笔试题目(含答案)更新时间:2017/2/5 19:25:00 浏览量:557 手机版JSP综合测试笔试1)在Java EE中,Servlet是在服务器端运行,以处理客户端请求而做出的响应的程序,下列选项中属于Servlet生命周期阶段的是( )A.加…

句法依存分析_[NLP学习笔记]句法分析
句法分析任务简介成分句法分析(Constituency Parsing):分析句子的成分,给出一棵树由终结符和非终结符构成的句法树。依存句法分析(Dependency Parsing):分析句子中词与词之间的依存关系…

modifiers在JAVA中_Java Modifier.classModifiers方法代碼示例
import java.lang.reflect.Modifier; //導入方法依賴的package包/類/*** Returns a string describing this {code Class}, including* information about modifiers and type parameters.** The string is formatted as a list of type modifiers, if any,* followed by the k…

华为笔试题---明明的随机数
题目 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不…

扩展城市信道etu模型matlab仿真,LTE System Toolbox:无线通信系统的仿真、分析和测试...
LTE System Toolbox 提供用于设计、仿真和验证 LTE 和 LTE-Advanced 通信系统且符合标准的函数和应用程序。该系统工具箱加速了 LTE 算法和物理层 (PHY) 部署,支持黄金参考验证和一致性测试,并能够生成测试波形。借助该系统工具箱,您可以配置…
i/o多路复用笔记
1、用户空间和内核空间 操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也可以访问底层硬件设备。为了保护用户进程不能直接操作内核,保证内核的安全,操作系统将虚拟空间划分为两部分࿰…

接口有个电池标志_USB接口上的小标签有啥用?从“+”号到闪电的奥秘
你有注意过自己PC,尤其是笔记本USB接口上面的小符号了吗?从“”号到闪电,小狮子前几天移动硬盘接驳始终没反应的时候,各种切换完毕发现这似乎是一个平时很少注意的细节啊……从“”号开始谈起仔细端详PC USB接口的时候会发现&…

java arraylist优点_Java中各种集合的特点总结
1:集合:(1) Collection(单列集合)List(有序,可重复)ArrayList底层数据结构是数组,查询快,增删慢线程不安全,效率高Vector底层数据结构是数组,查询快,增删慢线程安全,效率低LinkedList底层数据结构是链表,查询慢,增删快线程不安全,效率高Set(无序,唯一)HashSet底层数…

mysql主从结构主数据库_mysql主从结构主数据库
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

JZOJ 5461 购物 —— 贪心
题目:https://jzoj.net/senior/#main/show/5461 贪心,原来想了个思路,优先选优惠价最小的 K 个,然后其他按原价排序遍历; 如果当前物品没选过,原价选上,如果选过,考虑把它换成原价&a…

matlab中的expotest,提高Fortran矩阵指数性能(Expokit比Matlab、Python慢)
我正在进行一个模拟,其中的瓶颈是执行大量复杂的双精度矩阵指数运算,我发现Fortran(Expokit)对于小矩阵很好,但对于较大的矩阵,它的性能比Matlab或Python差。在我在下面包含了一个显示类似行为的模型程序,尽管它需要更…

Win7下使用Putty代替超级终端通过COM串口连接开发板方法
1、如果电脑(笔记本)没有串口接口,则需要使用一个 USB-Serial 转换线,这里使用 prolific usb-serial USB--串口转换线,首先需要在win7上安装对应的 USB--串口转换线 驱动程序,PL2303_Prolific 驱动程序下载…

java内部类 缺点_Java中的内部类及其优势
Java中提供了定义内部类的选择,这一机制使得代码的书写更为方便和优雅(功能上相关的代码被紧密的组织在了一起)。需要注意的是,内部类和传统的组合(即将一个类的实体定义为另一个类的成员)是完全不同的,其主要特性表现在以下的一些方面&#…

php webapi验签,Asp.netCore3.0 WebApi从0到1手摸手教你写【5】增加接口参数签名验证...
通过前几个教程的学习,对webapi的编写基本上就可以入门了,可以做项目了,今天我们再给接口加个参数签名认证,之前的接口相当于赤果果的暴露在了网络上,只要知道接口地址、接口调用方式和传参就可以畅所欲为的调用接口了…