返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 二进制数据在JS程序里的表达
 LEOX55寸液晶显示器72台助力…
 为什么内存不叫运存?
 辉达A800芯片在中国一天一个…
 RTX 4060显卡会锁算力吗 40系…
 RTX 4060会像2080 Ti一样强大…
 想赚算力的钱这些GPU前沿知识…
 长期喝咖啡会导致皮质醇过高…
 中国管制镓和锗出口反制美国…
 解锁展会超前剧透!Voury卓华…
 49英寸OLED沉浸式超大曲面屏…
 翰博高新:目前公司产品主要…
 折叠屏手机普及推动 OLED显示…
 笔记本电脑处理器排行笔记本…
 2023笔记本电脑性价比排行7月…
 「笔记本电脑cpu排名」2022笔…
 游戏笔记本电脑排行榜前十名…
 笔记本电脑cpu排名 笔记本电…
 Wi-Fi满格网速却快不起来咋整…
 别被忽悠 技嘉上市五款P35主…
 英特尔400系主板渠道报价出炉…
 微星B660主板信息泄露:售价…
 锦浪科技位列IHS2021年度逆变…
 AMD AM5 主板全面涨价 A620 …
 《GitHub和出口管制条例》中…
 “VMA”是“Virtual Memory …
 有道词典桌面版更名为有道翻…
 UOD 2022再次见证引擎行业之…
 MEXC抹茶:区块链技术+渲染可…
 黄仁勋:NVIDIA(英伟达)是…
 英伟达创始人黄仁勋台大演讲…
 腾讯22年前第一个专利揭秘发…
 图形处理器(GPU)专利态势研…
 英伟达创始人黄仁勋最新毕业…
 游戏显示器推荐→打游戏选对…
 4K以内选好机 低价液晶PC精挑…
 最新文章_台式电脑频道_天极…
 实用型双核19液晶主流价位台…
 新闻简讯一体电脑_一体台式机…
 笔记本电脑cpu排行榜天梯图2…
 电脑处理器性能排行榜
 最新笔记本电脑cpu排行榜 20…
 2019年7月份笔记本CPU天梯图…
 笔记本CPU天梯图2023年7月最…
 “电侦探”:算准每一度电
 施工现场临时用电计算分享!
 英杰电气:公司是专业的工业…
 航天长峰:公司子公司航天朝…
 一度电多少瓦 一度电多少瓦数
 磁盘存储·硬件存储
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
二进制数据在JS程序里的表达
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/7/13 1:00:49 | 【字体:

  异世之我是死神因为随着XHR2和现代浏览器的普及,在浏览器当中处理二进制不再向过去那样无所适从,随着vas/WebGL等新技术逐渐开始进入大众视野,也会用到一些字节数组或者16位、8位整数等东西。在刚刚发布的4.0版本中,Buffer的底层使用了更符合JS标准的Uint8Array来实现,浏览器和node.js再次向相同的目标靠近了一点点,所以对于JS中处理二进制,我就打算写这篇文章作一个入门性质的流水账,方便一些对二进制处理不了解的同学快速入门,虽然在前端领域用到的不多,不过也可以作为茶余饭后的休闲谈资。

  现今世界上几乎所有的计算机体系结构都是以字节(byte)为二进制数据的基本单位(注:不是说最小单位),所以二进制常常以字节数组的形式存在于程序当中。例如在C#里面,就用byte[],标准C里面没有byte类型,但可以通过typedef把byte定义为unsigned char的别名,效果是一样的。

  JS设计之初似乎根本没想过要处理二进制的东西,加上对类型的极度弱化,对于字节的概念可以说是非常非常的模糊。如果要表达字节数组,那么似乎只能用一个普通数组来表示。

  HTML5体系引入了一大堆新的东西,比如XHR2,是可以上传或下载二进制内容的,与之配套的东西就是JS里的ArrayBuffer和Typed Array了。

  ArrayBuffer是一个固定长度的字节序列,你可以通过new ArrayBuffer(length)来得到一片空间,或者用下文将会介绍的方法从XHR2等途径获取。由于内部实现与数组不一样,ArrayBuffer通常都是连续内存(注意,这只是经验之谈,并不是规范也不是文档所明确的),因此对于高密度的访问操作而言它比JS中的Array速度会快很多(但并不要用它来简单地代替Array)。如果用Chrome的Profile工具查看Heap Snapshot,会发现ArrayBuffer会被单独列为一类,也许它的内存分配和布局与Array以及其他JS对象有一些差别吧。

  Typed Array的背后是一个ArrayBuffer,也就是说,事实上的数据是存在ArrayBuffer里面的,而Typed Array只是给你提供了一个某种类型的读写接口,用MDN的话说,叫做

  举个栗子,如果我们有一个ArrayBuffer名为buffer(先不考虑怎么构造这个测试数据),内容如下:

  可以看出,如果要手工构造上面的测试数据ArrayBuffer,用Uint8Array就会很方便(呃事实上这是我个人最常用的一种Typed Array)。

  而如果用同样的ArrayBuffer构建带符号整数类型,则可能因为整数溢出而得到不同的结果,上面的例子并没有碰到,有兴趣的话可以自己试试。因此使用Typed Array也可以用来做有符号数和无符号数的转换。

  然而最最重要的一个概念还是:Typed Array不直接存放任何数据,所有对Typed Array进行读写的操作,最终都会落实到它背后所持有的ArrayBuffer的身上。ArrayBuffer才是真正的raw bytes,而Typed Array只是一个操作窗口/操作视图(View)。

  nodejs那边先按住不表,这里谈谈在网页里如何获取二进制数据?常见的办法有3种,1是通过XMLHttpRequest 2,2是通过File和Blob一套相关接口。

  在HTML5中提供了对表单的文件控件[ ] 更丰富的操作,可以通过inputDOM对象的.files来获取一个FileList,当然通常浏览器都只提供了单选的文件控件,于是这里都只会有一个File对象。另外,通过拖拽、剪贴板等方式也能获取到File或者Blob。

  File继承了Blob,并提供了name, lastModifiedDate等基础元数据,但是依然是一个深度封装,不能直接获取到它的二进制。

  这时候需要借助FileReader的帮忙。FileReader提供了一组用来将Blob读取为更为实用的类型的方法

  可以干什么呢?例如图片上传之前的本地预览(甚至基于canvas的编辑)等等都可以实现了。

  何谓消费?最常见的方式也许就是通过XHR2直接把二进制数据以文件方式POST到服务端去。

  这里我比较推荐使用FormData来构造POST数据。因为在服务端收的时候会比较容易一些,具体有兴趣可以去找找别人的例子。

  虽然直接提交ArrayBuffer也是可以的,但是这种时候服务端收到的POST body会是一大团,用起来不方便。如果要使用FormData来提交ArrayBuffer,需要先将其构造成Blob。

  上面的代码就能以buffer向后偏移10字节处为起点来构造Int16Array,但是如果将10设置为一个奇数,会发现如下错误:

  这是因为Typed Array对内存对齐有要求,它不能在非对齐的位置建立,同理,Uint32Array和Int32Array则要求偏移量是4字节对齐的。

  因此如果你希望在非对齐的位置进行读写,则需要借助DataView的帮忙。

  我们日常中所写的程序,几乎都不需要关心字节序,因此这个问题没那么严重,知道自己的程序会有字节序问题的人,开发到这里也肯定会知道问题的存在,但这里还是稍微提一下。

  按照MDN的说法,Typed Array只会使用当前平台的字节序,例如我们现在用的桌面电脑不论PC还是Mac都是x86/x64的,也就是little-endian了。

  使用DataView,不仅可以解决上面说到的内存对齐的问题,还可以指定读写时的字节序,具体参数都在文档里面了,就不搬运了。

  使用DataView配合Typed Array也可以做到一个检测当前平台字节序的技巧:

  如果你编写的程序需要垮体系结构例如x86/ARM/PPC等,则在交换文件和网络包的时候需要谨慎处理字节序,当然一个办法是在这些地方预先规范统一字节序以防后患。不过那些都是题外话了。

  另外罗嗦一句,浏览器还提供了一系列所谓的“Binary String”,就是一些看起来像乱码一样的字符串,然后又提供了atob/btoa这种方式来对Base64和“Binary String”进行相互转换,甚至FileReader还提供了readAsBinaryString方法(已经废弃了,善哉)。这个Binary String真是谁用谁遭殃,别问我为什么知道……

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 二进制数据在JS程序里的表达 (07-13)
    普通电脑内存 LEOX55寸液晶显示器72台助力呼伦贝尓华能蒙东… (07-13)
    普通电脑内存 为什么内存不叫运存? (07-13)
    普通电脑内存 《GitHub和出口管制条例》中英文官方版 (07-12)
    普通电脑内存 “VMA”是“Virtual Memory Area”的缩写意思… (07-12)
    普通电脑内存 有道词典桌面版更名为有道翻译增加AI智能改写… (07-12)
    普通电脑内存 UOD 2022再次见证引擎行业之光 (07-12)
    普通电脑内存 MEXC抹茶:区块链技术+渲染可以推动内容创作 (07-12)
    普通电脑内存 佰维存储:公司暂未布局高带宽内存领域 (07-11)
    普通电脑内存 荣耀MagicPad平板电脑现身Geekbench 提供16GB… (07-11)
    普通电脑内存 佰维存储:公司暂未布局高带宽内存领域但我们… (07-11)
    普通电脑内存 《暗黑4》开发总监表示将通过下周补丁修复内存… (07-11)
    普通电脑内存 内存焦虑的信息时代对NAS普及程度的影响 (07-11)
    普通电脑内存 福建男子捡到富家女的内存卡以视频要挟转100万… (07-10)
    普通电脑内存 VRAM解释:GPU专用内存 (07-10)
    普通电脑内存 为啥推荐视频创作者使用NVMe M2 SSD? (07-10)
    普通电脑内存 国科微:您的建议我们已经收悉。公司主营业务… (07-10)
    普通电脑内存 EMMC存储什么是EMMC存储?的最新报道 (07-10)
    普通电脑内存 菜鸟轻松“玩” 个性G31携中文BIOS降临 (07-10)
    普通电脑内存 占用英语短语_百度文库 (07-10)