专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

聊一聊JS中的二进制

  在JavaScript中,有很多跟二进制相关的概念,例如Buffer,TypedArray,ArrayBuffer,Blob,Stream等等。那么这些概念彼此之间的关系是什么?各自的使用场景是什么?这将是本文内容的重点。定型数组(TypedArray)
  首先介绍下定型数组。定型数组是一种用于处理数值类型(注意不是所有类型)数据的专用数组,ArrayBuffer(数组缓冲区)只是其中的一个概念。定型数组的历史
  定型数组最早是在WebGL中使用的,WebGL是OpenGLES2。0的移植版,在WebGL早期的版本中,因为JavaScript数组与原生数组之间不匹配,所以出现了性能问题。
  JavaScript数组在内存中的格式是双精度浮点格式(IEEE75464位),但图形驱动程序API通常不需要以JavaScript默认的双精度浮点格式传递给它们的数值。所以每次WebGL与JavaScript运行时之间传递数组时,WebGL都需要在目标环境重新分配数组,以其当前格式迭代数组,然后将数值转换成新数组中的适当格式,这需要花费很多时间。
  为了解决上面的问题,Mozilla实现了CanvasFloatArray。它提供了JavaScript接口的、C语言风格的浮点值数组。最终该类型成为了Float32Array,即定型数组的其中一个类型。数组缓冲区(ArrayBuffer)
  ArrayBuffer是所有定型数组的基础,它是一段可以包含特定数量字节的内存地址,这在其他语言中被称为ByteArray。创建ArrayBuffer的过程类似于在C中调用malloc()来分配内存,只不过不需要指明内存块所包含的数据类型。letbuffernewArrayBuffer(10);在内存中分配10字节
  需要注意一点:ArrayBuffer一旦创建就不能改变大小。
  当然,仅创建存储单元没什么用,我们需要将数据写入到存储单元中,所以还需要创建一个视图来实现写入功能。
  数组缓冲区是内存中的一段地址,视图是用来操作内存中的接口。视图可以操作数组缓冲区或缓冲区的子集,并按照其中一种数值型数据类型来读取和写入数据。DataView
  第一种允许读写ArrayBuffer的视图是DataView,它是一种通用的数组缓冲区视图。该视图专为文件IO和网络IO设计,其API支持对缓冲数据的高度控制,但相比于其他类型的视图性能要差一些。
  使用示例如下:letbuffernewArrayBuffer(10)letviewnewDataView(buffer)
  DataView有以下几个属性:buffer:视图绑定的数组缓冲区;byteOffset:DataView构造函数的第二个参数,默认是0,只有传入参数时才有值;byteLength:DataView构造函数的第三个参数,默认是缓冲区的长度的bytelength。
  DataView对存储在缓冲内的数据类型没有预设值,它的API强制开发者在读、写时指定一个ElementType,然后DataView就会按照指定的类型做相应转换。DataView支持的ElementType有如下8种:
  类型
  字节
  说明
  Int8
  1hr8位有符号整数
  Uint8
  1hr8位无符号整数
  Int16
  2hr16位有符号整数
  Uint16
  2hr16位无符号整数
  Int32
  4hr32位有符号整数
  Uint32
  4hr32位无符号整数
  Float32
  4hr32位IEEE754浮点数
  Float64
  8hr64位IEEE754浮点数
  以上每种类型都暴露了get和set方法,例如getInt8(byteOffset,littleEndian),setFloat32(byteOffset,value,littleEndian)。更详细的介绍查看:DataView。定型数组
  定型数组是另一种形式的ArrayBuffer视图,它是用于数组缓冲区的特定类型的视图,可以直接强制使用特定的数据类型而不是通用的DataView对象来操作数组的缓冲区,定型数组遵循原生的字节序。
  定型数组的类型有如下几种:
  构造函数名
  字节
  说明
  Int8Array
  1hr8位有符号整数
  Uint8Array
  1hr8位无符号整数
  Uint8ClampedArray
  1hr8位无符号整数(强制转换)
  Int16Array
  2hr16位有符号整数
  Uint16Array
  2hr16位无符号整数
  Int32Array
  4hr32位有符号整数
  Uint32Array
  4hr32位无符号整数
  Float32Array
  4hr32位IEEE浮点数
  Float64Array
  8hr64位IEEE浮点数
  上面的Uint8ClampedArray和Uint8Array大致相同,唯一的区别在于数组缓冲区中的值如果小于0或大于255,Uint8ClampedArray会将其分别转换成0或者255。例如,1会变成0,300会变成255。
  按照JavaScript之父BrendanEich的说法:Uint8ClampedArray完全是HTML5canvas元素的历史遗留。除非真的做跟canvas相关的开发,否则不要使用它。字节序
  使用定型数组可以查看相同字节序列的8、16、32或64位视图。这里就涉及到字节序的问题。所谓字节序指的是计算机系统维护的一种字节顺序的约定。它分为两种:大端字节序(bigendian)和小端字节序(littleendian):大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。小端字节序:低位字节在前,高位字节在后。例如数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11,所以对应的小端字节序为0x1122。
  可以使用以下代码确定底层平台的字节序:如果整数0x00000001在内存中的排列为01000000则底层使用小端字节序。在大端字节序平台中应该是00000001letlittleEndiannewInt8Array(newInt32Array(〔1〕)。buffer)〔0〕1
  目前市面上常见的CPU都是小端字节序。而很多网络协议及某些二进制文件格式则要求使用大端字节序。
  为了考虑效率,定型数组使用底层硬件的原生字节序。上面提到的DataView并不遵守这个约定。对一段内存而言,DataView是一个中立接口,它会遵循你指定的字节序。DataView所有API方法都以大端字节序为默认值,但可以通过接收一个true开启小端字节序。constbufnewArrayBuffer(2)constviewnewDataView(buf)按小端字节序读取Uint16view。getUint16(0,true)Stream
  SteamAPI是为了解决Web应用有序消费小信息块而不是大信息块的问题的。这种能力的应用场景如下:大信息块可能不会一次性都可用:网路请求的响应就是一个典型的例子。网路负载以连续信息包的形式交付,而流式处理可以让应用在数据一到达就能使用,而不必等到所有数据都加载完毕。大数据块可能需要分小部分处理。例如视频处理、数据压缩等。
  StreamAPI直接解决的问题是处理网络请求和读写磁盘,它定义了三种流:可读流:通过某个公共接口读取数据块的流。数据在内部从底层源进入流,然后由消费者(consumer)进行处理;可写流:通过某个公共接口写入数据块的流。生产者(producer)将数据写入流,数据在内部传入底层数据槽(sink);转换流:由两种流组成,可写流用于接收数据(可写端),可读流用于输出数据(可读端)。这两个流之间是转换程序(transformer),可以根据需要检查和修改流内容。
  流的基本单位是块(chunk)。块可以是任意数据类型,但通常是定型数组。每个块都是离散的流片段,可以作为一个整体来处理。块的大小不固定,也不一定按固定时间间隔到达。Blob
  Blob和文件读取有关。某些情况下,我们需要读取部分文件而不是整个文件。为此,File对象提供了名为slice()的方法。slice()方法返回一个Blob实例。File接口基于Blob,继承了blob的功能并将其扩展以支持用户系统上的文件。
  blob表示二进制大对象(binarylargetobject),是JavaScript对不可修改二进制数据的封装类型。包含字符串的数组、ArrayBuffer、ArrayBufferView,甚至其他Blob都可以用来创建blob。它的数据可以按文本或二进制的格式进行读取,也可以转换成ReadableStream来用于数据操作。
  Blob有两个属性:Blob。prototype。size:表示Blob对象所包含的数据的大小(字节);Blob。prototype。type:一个字符串,表明该Blob对象所包含的MIME类型。如果类型未知,则该值为空。
  Blob的实例方法如下:Blob。prototype。arrayBuffer():返回一个promise,resolve后结果包含Blob所有内容的二进制格式的ArrayBuffer;Blob。prototype。slice():返回一个新的Blob对象,包含了源Blob对象中指定范围内的数据;Blob。prototype。stream():返回一个能读取Blob内容的ReadableStream;Blob。prototype。text():返回一个promise,resolve后结果包含Blob所有内容的UTF8格式的字符串。Buffer
  最后我们再来聊一下Buffer,和上面的几个不同的是,Buffer是Node。js中特有的,但是实际上Buffer类是JavaScript中Uint8Array的子类,并且对其进行了扩展。
  Buffer的实例也就是JavaScriptUint8Array和TypedArray的实例,所有TypedArray的方法在Buffer中都支持。然而BufferAPI和TypedArrayAPI有些许的不同:TypedArray。prototype。slice()复制调用数组的一部分并返回一个新数组,而Buffer。prototype。slice()在不复制的情况下在现有缓冲区创建视图。TypedArray。prototype。subarray()可以实现和Buffer。prototype。slice()相同的行为,它在Buffer和TypedArray中没有区别;buf。toString()与TypedArray。prototype。toString()不兼容;Buffer中的很多方法例如buf。indexOf()支持附加参数。
  所以我们可以认为Buffer和TypedArray是为了处理一类问题而存在的,但是在实际使用过程中还是要注意兼容性问题。总结
  以上就是JS中和二进制相关的一些概念。最后,用一张图总结一下上面提到的这些概念的关系:

NBA球星都是如何炫富的,谁的炫富方式最夸张?NBA谁炫富最震撼?两人炫私人飞机,1人美金当厕纸,詹皇最土豪塔克炫豪车只要能在NBA中成为一名主力球员,年薪超过500万美元都算是一名富豪了,都可以在美国开上跑车住上豪宅,火箭队怀宝宝前,夫妻双方需要做哪方面的调理?夫妻孕前注意事项在准备怀孕前一段时间,要注意饮食多样化,加强合理营养,为男女双方生成良好的精子和卵子创造有利的条件。早睡早起,适当做些锻炼,如慢跑快步走游泳等(切记避免高强度的运动现在的数学老师为什么总让孩子做数学题?教育有焦点,我们有观点!现在的数学老师为什么总是让孩子做数学题?我是数学老师,我来给你回答这个问题吧!在回答这个问题时我们开先看看下面几句话。在其位谋其政,任其职尽其责!出自论语泰有没有用过片仔癀皇后珍珠膏的朋友,感觉怎么样?2020年春节被家人强烈安利后开始用,用了其中两款,一款普通级,一款臻润级,最初用保湿祛痘印养肤感觉还不错,南方冬天用普通款的够用,不会干,臻润级夏天用。用到2022年产品品质下滑缠论真的有坑吗?说说你的想法?上涨的时候所以理论都成立,单边下跌的行情所以理论都不成立学习不精哪都是坑,想掌握好缠论,一万小时入门,二万小时提升,再以后基本就是基本功了,用什么方法都可以做股票,不用画来画去也会并不合格的电动车,10月销量4。8万辆,宏光MINIEV做对了啥?一基层人很多二大多数基层人经济窘迫,又迫切需要一辆符合管理要求标准的车来应付生活!即便是质量不怎么好,不很安全,只要是便宜,让上路跑就好。这辆车终于出现了,它就是五菱宏光MINIE如何利用Python编程批量处理Excel,来提高日常工作效率?思路与选择更重要我看过许多人一看到别人提问python处理excel之类的话题,立马就说出一大堆的库,结果很多初学者苦苦地编写Python代码处理数据,最后他们都会感觉太坑爹了。如手机为什么还代替不了电脑?手机是一个小屏的产品,他更多是以娱乐游戏为主,这个方面已经替代了电脑很多,但是电脑还有他的核心价值,那就是办公需求,而且电脑也是大屏的,在有些时候观看电影玩游戏电脑上还能更爽一点!有没有一些好玩的或新奇的app吗?尽管iPhone7新增了防水功能,但是听筒依然是最脆弱的一环。一旦把水溅到手机听筒中,听筒会变得沙哑有杂音。网上流传的吹风机大米棉签等方法通常是没有用的。还记得当初AppleWat学文科应该报什么专业?我自己是文科生,我儿子也是文科高中生。我儿子在准备考大学,所以我在关注文科的专业。我把文科的专业分成了四大类。第一类,财经。财经我分了两类。一类是需要计算的财经,学这类数学必须好。六年级,如何提高语文成绩?我是一名小学老师,这几年一直教六年级语文。对于提升六年级学生语文成绩,我有以下建议一是要有目标有计划。一直以来,我在接新班时,都会让学生建立一个课堂笔记本,笔记本的第一页上写上这样
蔚来称男人收到的第1束花在坟前,如此营销的鬼才,让蔚来难有未来2月14日,蔚来一门店的情人节营销文案引发网友热议。图片显示该店铺位于成都中粮大悦城蔚来空间店,配图文案写着大部分男人收到的第一束鲜花都是在自己的坟前。此举引发不少网友不满让人沮丧10大行业40个案例,解读快手电商2023年营销新趋势!作为稳健发展的新增量市场,快手为越来越多的品牌商家提供了确定性的生意增长机遇,也让2023年的电商市场充满可能。为了帮助品牌商家深度把握2023年营销脉络,飞瓜数据快手重磅上线20河北邯郸紧固件外贸订单忙2月15日,在河北省邯郸市永年区一家紧固件生产企业的数字化智能生产车间,工人在检查设备运行情况。今年以来,河北省邯郸市永年区通过邀请专家培训外贸知识组织企业出海抢订单免费为企业代办民企百强,湘企都有谁?这两天,任泽平团队发布的民营企业100强排名榜单流传盛广。严格来说,这并不是一份全新的榜单。它是对比了全国工商联中国企业协会财富胡润等榜单,并结合民营企业上市发债等情况,以民营企业真抓实干丨湘西高新区五好园区蹄疾步稳引领经济高质量发展红网时刻新闻2月16日讯(记者张艺凡通讯员向雅生)湘西高新区抢抓发展机遇,以创建国家高新区为目标,积极落实三高四新战略定位和使命任务,突出五好园区建设,2022年,在133家省级及品招股书第1期行业篇鹰击长空,看军工!一金塔社评析军陶科技于2022年6月30日申报创业板并获受理,截至目前公司第二轮审核问询函已经回复,2015年12月2017年10月原控股股东镇江达普在股转系统挂牌,经过多次股权变渗透率超过10,混动成为增长最快细分市场合资自主品牌加速入局每经记者孙桐桐每经编辑裴健如日前,长安福特发布了一套动力分流混动技术方案,将首次搭载在全新大7座SUV锐界L车型上,预计今年内上市。至此,长安福特正式加入了混动大战。图片来源企业供申通快递2023年与阿里关联交易预计超80亿,更换证券事务代表提示!快递生态圈主要目标群(投资人私募基金券商机构各地方政府决策者快递监管部门快递经营者媒体从业者快递上下游经营者加盟网点老板年薪30万以上快递物流从业者)添加公众号之前请阅读提示小仙炖首创科学滋补专业养生健康服务,引领行业价值升级近日,鲜炖燕窝领导品牌小仙炖联合京东健康召开鲜炖燕窝营养科普行动发布会。会上,权威专家分享了鲜炖燕窝营养科研的前沿成果,小仙炖正式发布中式滋补行业内首创的科学滋补专业养生健康服务,寒锐钴业拟募资50亿押注高镍锂电总投资93亿达产后预计年营收超64亿长江商报消息长江商报记者金度尽管钴金属价格下跌,寒锐钴业盈利能力下滑,但公司实控人梁建坤未改扩张决心。近日,寒锐钴业(300618。SZ)发布公告显示,公司拟非公开发行不超9288南方惠评围绕产业链部署创新链,惠州需要更多高水平研发机构2月15日,埃克森美孚大亚湾研发中心破土动工,计划2025年投入运营。惠州支柱产业石化能源新材料产业将新增一间高水平研发机构。该研发机构备受人们关注与期待,这是这家国际石化巨头在北
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网