当前位置: 首页 > 编程日记 > 正文

位域 内存 字节序_JS操作内存?二进制数组了解一下

二进制数组的由来

主要是为了提高浏览器与显卡之间的通信效率,由二进制数据代替传统的文本。

二进制数组主要有三个对象:

  • ArrayBuffer
  • TypedArray
  • DataView

ArrayBuffer对象

ArrayBuffer是一个构造函数,参数是一个数字,代表索取多少个字节的内存。例如:

var buffer = new ArrayBuffer(12);

代表生成12个字节的内存区域。

注意:ArrayBuffer对象本身并不能直接对生成的内存区域进行读写(除了slice方法),需要借助视图TypedArray和DataView来对其进行读写。

三个方法:

  • 实例方法byteLength,返回生成内存的字节大小
  • 实例方法slice,这个方法和数组类似,就是生成一段新的内存,并填充拷贝的内容
  • 静态方法isView,是否是视图
80676808552a6a4cdc0459894268878b.png

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对象)

30020ccb3c5f08c264d0c4e58cc5a3c7.png

demo2

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

f8de8ae049b15c7799583216bf139f28.png

demo3

用法4:

new TypedArray(普通的数组)

e37df93fa92c99c20d4f66d38dea4944.png

demo4

demo4中操作typedArray不会使aa发生变化,说明它们没有共用同一段内存。

TypedArray的数值

二进制数组采用小端字节序,数组前面的元素的位相对较低,越往后越高,比如demo5中32这个元素就没有后面0的元素位高,转化成16进制应该是0x0000000000000020,如果采用16位或者32位视图,再对应将其划分。

0636686b75ffe46abecf8046b277ad65.png

demo5

小端字节序:低位在前,高位在后;

大端字节序:高位在前,低位在后;

TypedArray的数值溢出

什么是溢出呢?看下图:

a9d616bd36217ec70e301b629b239d11.png

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}
c219782a10e0596df45eaa3052531d09.png

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}
ba0c3a28d6bca889f48082e725afb7ba.png

demo8

DataView对象

DataView对象和TypedArray对象最大的区别是可以自定义大端字节序还是小端字节序!

用法:

var buf = new ArrayBuffer(n);var dv = new DataView(buf, 字节起始位置, 长度);//查看demo6
41c7bbf709ac408f717a89a9c68d05a1.png

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&#xff0c;i2&#xff0c;…&#xff0c;in&#xff0c;如果其中存在j,k&#xff0c;满足 j < k 且 ij > ik&#xff0c; 那么就称(ij,ik)是这个排列的一个逆序。 一个排列含有逆序的个数称为这个排列的逆序数。例如排列 263451 含…

mysql 查看当前事务id,MySQL 如何查询当前最新事务ID

写在前面&#xff1a;在个别时候可能需要查看当前最新的事务 ID&#xff0c;以便做一些业务逻辑上的判断(例如利用事务 ID 变化以及前后时差&#xff0c;统计每次事务的响应时长等用途)。通常地&#xff0c;我们有两种方法可以查看当前的事务 ID&#xff1a;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的内存分析工具进行熟悉&#xff0c;这样以后出现机器负载较高&#xff0c;或者反应很慢的时候&#xff0c;我就可以查找原因了。上网搜了搜&#xff0c;发现下面这些是比较常用的&#xff0c;然后我在机器上试试了&#xff0c;把结果也贴出来哈。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签名栏的下划线随列宽变化,是不是感觉牛哄哄的?...

职场牛人的世界总有各种高招&#xff0c;随手蹦出&#xff0c;令人赞叹不已&#xff01;今天早上去填一个表格&#xff0c;在输入签名时&#xff0c;突然发现签名处的下划线是随着列宽的变化而自动变化&#xff0c;这绝对是动态的&#xff0c;这是怎么做到的呢&#xff1f;我特…

JS高级程序设计拾遗

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

mysql建立高效索引,如何知道你建立的MySQL索引是高效,合理的

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

32位java 最大内存_【答疑系列】为什么32位系统只支持最大4G内存?

这个问题一直都有同学问到&#xff0c;算是提问次数最多的问题之一了。32位是什么现在主流的操作系统都是64位的&#xff0c;早期存在32位操作系统&#xff0c;相信大家也都有所听闻&#xff0c;其实&#xff0c;在更早之前&#xff0c;还有16位、8位的&#xff0c;这里就不展开…

新手C#string类常用函数的学习2018.08.04

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

开始使用博客了,改变从这里开始。

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

php 贝瑟尔曲线,贝塞尔曲线的应用详解

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

区别 eks_sport 和 exercise 有什么区别?看完你就清楚了!

说到“运动”sport 这个单词应该是不少人看到“运动”的第一反应吧sport /spɔ:t/ n.体育运动例如&#xff1a;Id say football is my favourite sport.我最喜欢的运动要数足球了。习语&#xff1a;be a sport 讲交情例如&#xff1a;Shes a good sport.她很讲交情。sport通常指…

java gps时间转换工具_java 时间戳和时间互转工具 和 时间偏移量计算

时间互转代码片段&#xff1a;* 时间戳 转 时间 ** 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这个类&#xff0c;jango才能识别Book是一张表namemodels.CharField(max_length20)#charfield字符串类型&#xff0c;长度20#pricemodels.FloatFi…

java ee 笔试题目,JSP经典笔试@题目(含答案)

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

句法依存分析_[NLP学习笔记]句法分析

句法分析任务简介成分句法分析&#xff08;Constituency Parsing&#xff09;&#xff1a;分析句子的成分&#xff0c;给出一棵树由终结符和非终结符构成的句法树。依存句法分析&#xff08;Dependency Parsing&#xff09;&#xff1a;分析句子中词与词之间的依存关系&#xf…

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…

华为笔试题---明明的随机数

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

扩展城市信道etu模型matlab仿真,LTE System Toolbox:无线通信系统的仿真、分析和测试...

LTE System Toolbox 提供用于设计、仿真和验证 LTE 和 LTE-Advanced 通信系统且符合标准的函数和应用程序。该系统工具箱加速了 LTE 算法和物理层 (PHY) 部署&#xff0c;支持黄金参考验证和一致性测试&#xff0c;并能够生成测试波形。借助该系统工具箱&#xff0c;您可以配置…

i/o多路复用笔记

1、用户空间和内核空间 操作系统的核心是内核&#xff0c;独立于普通的应用程序&#xff0c;可以访问受保护的内存空间&#xff0c;也可以访问底层硬件设备。为了保护用户进程不能直接操作内核&#xff0c;保证内核的安全&#xff0c;操作系统将虚拟空间划分为两部分&#xff0…

接口有个电池标志_USB接口上的小标签有啥用?从“+”号到闪电的奥秘

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

java arraylist优点_Java中各种集合的特点总结

1:集合&#xff1a;(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":"阿里云数据库专家保驾护航&#xff0c;为用户…

JZOJ 5461 购物 —— 贪心

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

matlab中的expotest,提高Fortran矩阵指数性能(Expokit比Matlab、Python慢)

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

Win7下使用Putty代替超级终端通过COM串口连接开发板方法

1、如果电脑&#xff08;笔记本&#xff09;没有串口接口&#xff0c;则需要使用一个 USB-Serial 转换线&#xff0c;这里使用 prolific usb-serial USB--串口转换线&#xff0c;首先需要在win7上安装对应的 USB--串口转换线 驱动程序&#xff0c;PL2303_Prolific 驱动程序下载…

java内部类 缺点_Java中的内部类及其优势

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

php webapi验签,Asp.netCore3.0 WebApi从0到1手摸手教你写【5】增加接口参数签名验证...

通过前几个教程的学习&#xff0c;对webapi的编写基本上就可以入门了&#xff0c;可以做项目了&#xff0c;今天我们再给接口加个参数签名认证&#xff0c;之前的接口相当于赤果果的暴露在了网络上&#xff0c;只要知道接口地址、接口调用方式和传参就可以畅所欲为的调用接口了…