Javascript 操作二进制数据
一个类型化数组(TypedArray)对象描述了一个底层的二进制数据缓冲区(binary data buffer)的一个类数组视图(view)。事实上,没有名为 TypedArray 的全局属性,也没有一个名为 TypedArray 的构造函数。相反,有许多不同的全局属性,它们的值是特定元素类型的类型化数组构造函数。
TypedArray 指的是以下的其中之一
Int8Array();
Uint8Array();
Uint8ClampedArray();
Int16Array();
Uint16Array();
Int32Array();
Uint32Array();
Float32Array();
Float64Array();
描述
ECMAScript 2015 定义了一个 TypeArray 构造器作为所有的类型化数组构造器(Int8Array, Int16Array 等)的原型([[Prototype]]
)。该构造器并不会直接暴露出来:即没有全局的 %TypedArray% 和 TypeArray 属性,只能通过使用类似于 Object.getPrototypeOf(Int8Array.prototype) 的方式直接访问。所有的类型化数组构造器都会继承 %TypeArray% 构造器函数的公共属性和方法。此外,所有的类型化数组的原型(如 Int8Array.prototype)都以 %TypeArray%.prototype 作为原型。
%TypedArray% 构造器自身不是特别有用,直接调用或使用 new 表达式实例化都会抛出一个TypeError 异常,除非在支持子类化(subclassing)创建对象的 JS 引擎下运行。但直到现在还没有这样的 JS 引擎出现。因此 %TypeArray% 仅仅在对所有的类型化数组构造器(Int8Array 等)的方法和属性进行 polyfill 的时候比较有用.
当创建一个 TypedArray 实例(如 Int8Array)时,一个数组缓冲区将被创建在内存中,如果一个 ArrayBuffer 对象被当作参数传给构造函数,那么将使用传入的 ArrayBuffer 代替(即缓冲区被创建到 ArrayBuffer 中)。缓冲区的地址被存储在实例的内部属性中,并且所有 %TypedArray%.prototype上的方法,例如 set value 和 get value 等,都会在这个数组缓冲区上进行操作。
属性访问
你可以使用标准数组索引语法获取类型化数组中的元素(也就是和访问普通数组元素一样,如 foo[1]
),然而,在类型化数组上获取或者设置属性的值时,并不会在这个属性的原型链中进行搜索,即使在索引超出了边界的时候。在原型中添加的属性将会在 ArrayBuffer 中查询而不是在对象的属性中。但是你依然可以像其他对象一样使用命名的属性来访问(foo.bar 的形式);具体见下面的例子:
// 使用标准数组语法来获取和设置属性值
var int16 = new Int16Array(2);
int16[0] = 42;
console.log(int16[0]); // 42// 原型中添加的属性访问不到(此时索引值未超边界,20 < 32)
Int8Array.prototype[20] = "foo";
(new Int8Array(32))[20]; // 0// 即使索引值超出了边界也一样不能访问(20 > 8)
Int8Array.prototype[20] = "foo";
(new Int8Array(8))[20]; // undefined// 使用负数索引也不行
Int8Array.prototype[-1] = "foo";
(new Int8Array(8))[-1]; // undefined// 但是可以使用命名属性的方式访问到
Int8Array.prototype.foo = "bar";
(new Int8Array(32)).foo; // "bar"
总结
ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。它是一个字节数组,通常在其他语言中称为“byte array”。
const buffer = new ArrayBuffer(8);console.log(buffer.byteLength);
// expected output: 8
你不能直接操作 ArrayBuffer 的内容,而是要通过类型数组对象或 DataView 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。
const buffer = new ArrayBuffer(8);
const view = new Int32Array(buffer);
类型化数组是 Javascript 操作(内存)二进制数据的一个接口。类型化数组是建立在 ArrayBuffer 对象的基础上的。它的作用是,分配一段可以存放数据的连续内存区域。ArrayBuffer 作为内存区域,可以存放多种类型的数据。不同数据有不同的存储方式,这就叫做“视图”。目前,JavaScript 提供以下类型的视图。
Javascript 操作二进制数据相关推荐
- html5 二进制数据解析,JavaScript读写二进制数据的方法详解
前言 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数,如果想要在前端中处理音频和视频.那你必须要对二进制数据有很好地掌握和操作能力.下面话不多说了,来一起看看详细介绍的吧 ...
- JavaScript与二进制数据的恩怨情仇
文章出自个人博客https://knightyun.github.io/2020/03/09/js-binary-data,转载请申明 编程江湖,终日血雨腥风,论及二进制数据,又有多少豪杰谈笑风生,风 ...
- sqlite 操作二进制数据
sqlite 操作二进制数据需要用一个辅助的数据类型:sqlite3_stmt * . 这个数据类型记录了一个"sql语句".为什么我把 "sql语句" 用双引 ...
- Javascript 处理二进制数据:JavaScript typed arrays
原文中文链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Typed_arrays 原文英文链接:https://developer ...
- java jdbc datetime_Java JDBC 操作二进制数据、日期时间
二进制数据 mysql提供了四种类型来存储二进制数据: TinyBlob 最多可存储255字节 Blob 最多可存储65KB MediumBlob 最多可存储16MB LongBlob ...
- h5如何上传文件二进制流_HTML5新特性之文件和二进制数据的操作
http://www.cnblogs.com/jscode/archive/2013/04/27/3572239.html 历史上,JavaScript无法处理二进制数据.如果一定要处理的话,只能使用 ...
- 微软字节javascript 类型数组读取二进制数据 -java教程
每日一贴,今天的内容关键字为微软字节 先建一个文件,按UTF-16大端 BOM 格式存保一个符字串:hi aleck, 用使 file API 把他按二进制方法取读到浏览器. 文件取读方法在这里: h ...
- 整理javascript操作文件说明.
Javascript是网页制作中离不开的脚本语言,依靠它,一个网页的内容才生动活泼.富有朝气.但也许你还没有发现并应用它的一些更高级的功能吧?比如,对文件和文件夹进行读.写和删除,就象在VB.VC等高 ...
- [JavaScript]为JS处理二进制数据提供可能性的WEB API
写这篇博客的起源是在div.io上的一篇文章<你所不知道的JavaScript数组>by 小胡子哥下的评论中的讨论. 因为随着XHR2和现代浏览器的普及,在浏览器当中处理二进制不再向过去那 ...
最新文章
- sybase Invalid command line argument 'and'.
- 道家遁甲式(又名道家奇门)
- 为什么要叫python-为什么叫Python
- (需求实战_进阶_03)SSM集成RabbitMQ 路由模式关键代码讲解、开发、测试
- 图像处理库Pillow
- Kubernetes Job Controller源码分析
- NumpyPandas内置函数实现分组
- 【当心】看房没戴头盔,损失二十万 。。。
- java ssm网上超市购物管理系统
- 如何使用光盘启动计算机,电脑如何设置光驱启动 电脑设置光驱启动方法【图文】...
- 生成验证码时,验证码图片不显示,报错信息如下:Can‘t create output stream;Can‘t create cache file
- python做一段有意思的代码_Python爬虫入门有意思的小长代码
- 自动机器学习-H2O.ai
- 数据可视化_科学统计图表5——ggplot绘制南丁格尔玫瑰图
- .dwg(sw)-exb
- HDU 1873 优先队列 Java版
- HTML 与HTML5 常用标签
- java中处理换行符
- 扫描IP软件,无线AP忘记IP地址
- 算术优化算法AOA(学习笔记_10)
热门文章
- 超10000支团队参赛,阿里云首届云原生编程挑战赛完美收官
- 腾讯云 AI 在新基建领域下一盘什么大棋
- TIOBE 6 月编程语言排行榜:C 与 Java 进一步拉开差距、Rust 跃进 TOP 20
- “谷歌杀手”发明者,科学天才 Wolfram
- 捐款捐物捐技术,14 家科技巨头抗疫在行动!
- Android 开发者成神之路!
- 如何轻松使用 C 语言实现一个栈?​
- 华为有意向西方公司出售 5G 技术;iOS 13 被爆漏洞;GNOME 3.34 正式发布| 极客头条...
- @程序员:别人身边的小姐姐是这样来的,你能学学吗
- 数十篇推荐系统论文被批无法复现:源码、数据集均缺失!