前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >​DataView 对象:JavaScript 中的数据处理利器

​DataView 对象:JavaScript 中的数据处理利器

原创
作者头像
Front_Yue
发布于 2023-12-31 11:14:04
发布于 2023-12-31 11:14:04
2.2K020
代码可运行
举报
文章被收录于专栏:码艺坊码艺坊
运行总次数:20
代码可运行

前言

在 JavaScript 中,我们经常需要处理大量的数据,包括从后端获取的数据、用户输入的数据等等。而在处理这些数据的时候,我们经常需要对数据进行排序、筛选、分组等操作。这时候,DataView 对象就成为了我们的得力助手。本文将详细介绍 DataView 对象的使用方法,并给出具体的实例。

正文内容

一、DataView 对象的概述

DataView 对象是 JavaScript 中的一个内置对象,它提供了一种机制,用于以不同的字节序列访问底层二进制数据缓冲区的方法。DataView 对象可以让我们以不同的字节序列(如大端序和小端序)来读写二进制数据,这对于处理网络数据和文件数据非常有用。

DataView 对象的主要作用是允许我们以不同的字节序列来读取和写入二进制数据。它提供了一组方法,可以让我们以不同的字节序列读写整数、浮点数、布尔值等数据类型。另外,DataView 对象还提供了一些方法,可以让我们对二进制数据进行排序、筛选、分组等操作。

二、DataView 对象的使用方法

1.创建 DataView 对象

要创建一个 DataView 对象,我们需要先创建一个 ArrayBuffer 对象。ArrayBuffer 对象是一个固定长度的二进制数据缓冲区,它不能直接读写数据,需要通过 DataView 对象来读写。

下面是创建一个 ArrayBuffer 对象的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let buffer = new ArrayBuffer(16);

上面的代码创建了一个长度为 16 字节的 ArrayBuffer 对象。接下来,我们可以使用 DataView 对象来读写这个缓冲区中的数据。

要创建一个 DataView 对象,我们需要调用 DataView 构造函数并传入一个 ArrayBuffer 对象和一个可选的字节偏移量。字节偏移量表示从缓冲区的哪个位置开始读写数据,默认值为 0。

下面是创建一个 DataView 对象的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let view = new DataView(buffer, byteOffset);

上面的代码创建了一个 DataView 对象,它使用了上面创建的 ArrayBuffer 对象,并从缓冲区的 byteOffset 字节处开始读写数据。

2.读写二进制数据

DataView 对象提供了一组方法,可以让我们以不同的字节序列(如大端序和小端序)来读写整数、浮点数、布尔值等数据类型。

读写整数

DataView 对象提供了四个方法,可以让我们以不同的字节序列来读写整数:

  • getInt8() 和 setInt8():读写 8 位有符号整数。
  • getUint8() 和 setUint8():读写 8 位无符号整数。
  • getInt16() 和 setInt16():读写 16 位有符号整数。
  • getUint16() 和 setUint16():读写 16 位无符号整数。
  • getInt32() 和 setInt32():读写 32 位有符号整数。
  • getUint32() 和 setUint32():读写 32 位无符号整数。
  • getBigInt64() 和 setBigInt64():读写 64 位有符号整数。
  • getBigUint64() 和 setBigUint64():读写 64 位无符号整数。

这些方法都有两个参数:第一个参数表示要读写的数据在缓冲区中的字节偏移量,第二个参数表示是否使用小端序。

下面是一个读写整数的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let buffer = new ArrayBuffer(16);
let view = new DataView(buffer);

view.setInt8(0, 0x12); // 写入一个 8 位有符号整数
view.setUint16(1, 0x3456); // 写入一个 16 位无符号整数
view.setInt32(3, 0x789ABCDE); // 写入一个 32 位有符号整数
view.setBigInt64(7, BigInt("0x123456789ABCDEF0")); // 写入一个 64 位有符号整数

console.log(view.getInt8(0)); // 18
console.log(view.getUint16(1)); // 13398
console.log(view.getInt32(3)); // 2023406814
console.log(view.getBigInt64(7)); // 1311768467463790320n

上面的代码创建了一个长度为 16 字节的 ArrayBuffer 对象,并使用 DataView 对象来读写这个缓冲区中的数据。首先,我们使用 setInt8() 方法在缓冲区的第 0 个字节写入了一个 8 位有符号整数 0x12。然后,我们使用 setUint16() 方法在缓冲区的第 1 个字节写入了一个 16 位无符号整数 0x3456。接着,我们使用 setInt32() 方法在缓冲区的第 3 个字节写入了一个 32 位有符号整数 0x789ABCDE。最后,我们使用 setBigInt64() 方法在缓冲区的第 7 个字节写入了一个 64 位有符号整数 0x123456789ABCDEF0。

然后,我们使用 getInt8() 方法读取缓冲区的第 0 个字节,得到了 18(0x12 的十进制表示)。接着,我们使用 getUint16() 方法读取缓冲区的第 1 个字节和第 2 个字节,得到了 13398(0x3456 的十进制表示)。接着,我们使用 getInt32() 方法读取缓冲区的第 3 个字节到第 6 个字节,得到了 2023406814(0x789ABCDE 的十进制表示)。最后,我们使用 getBigInt64() 方法读取缓冲区的第 7 个字节到第 14 个字节,得到了 1311768467463790320n(0x123456789ABCDEF0 的十进制表示)。

读写浮点数

DataView 对象提供了四个方法,可以让我们以不同的字节序列来读写浮点数:

  • getFloat32() 和 setFloat32():读写 32 位浮点数。
  • getFloat64() 和 setFloat64():读写 64 位浮点数。

这些方法都有两个参数:第一个参数表示要读写的数据在缓冲区中的字节偏移量,第二个参数表示是否使用小端序。

下面是一个读写浮点数的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let buffer = new ArrayBuffer(16);
let view = new DataView(buffer);

view.setFloat32(0, 3.14); // 写入一个 32 位浮点数
view.setFloat64(4, 1.23e-10); // 写入一个 64 位浮点数

console.log(view.getFloat32(0)); // 3.140000104904175
console.log(view.getFloat64(4)); // 1.23e-10

上面的代码创建了一个长度为 16 字节的 ArrayBuffer 对象,并使用 DataView 对象来读写这个缓冲区中的数据。首先,我们使用 setFloat32() 方法在缓冲区的第 0 个字节写入了一个 32 位浮点数 3.14。然后,我们使用 setFloat64() 方法在缓冲区的第 4 个字节写入了一个 64 位浮点数 1.23e-10。

然后,我们使用 getFloat32() 方法读取缓冲区的第 0 个字节到第 3 个字节,得到了 3.140000104904175。接着,我们使用 getFloat64() 方法读取缓冲区的第 4 个字节到第 11 个字节,得到了 1.23e-10。

读写布尔值

DataView 对象提供了一个方法,可以让我们以不同的字节序列来读写布尔值:

  • getUint8() 和 setUint8():读写 8 位无符号整数,可以用来表示布尔值。

这些方法都有两个参数:第一个参数表示要读写的数据在缓冲区中的字节偏移量,第二个参数表示是否使用小端序。

下面是一个读写布尔值的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let buffer = new ArrayBuffer(16);
let view = new DataView(buffer);

view.setUint8(0, true); // 写入一个布尔值
view.setUint8(1, false); // 写入一个布尔值

console.log(view.getUint8(0)); // 1
console.log(view.getUint8(1)); // 0

上面的代码创建了一个长度为 16 字节的 ArrayBuffer 对象,并使用 DataView 对象来读写这个缓冲区中的数据。首先,我们使用 setUint8() 方法在缓冲区的第 0 个字节写入了一个布尔值 true。然后,我们使用 setUint8() 方法在缓冲区的第 1 个字节写入了一个布尔值 false。

然后,我们使用 getUint8() 方法读取缓冲区的第 0 个字节,得到了 1。接着,我们使用 getUint8() 方法读取缓冲区的第 1 个字节,得到了 0。

3. 对二进制数据进行排序操作

DataView 对象提供了一个 sort() 方法,可以让我们对二进制数据进行排序。sort() 方法接受一个可选的比较函数作为参数,可以用来指定排序规则。

下面是一个排序二进制数据的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let buffer = new ArrayBuffer(16);
let view = new DataView(buffer);
view.setInt32(0, 0x12345678);
view.setInt32(4, 0x87654321);
view.setInt32(8, 0x456789AB);
view.setInt32(12, 0xCDEF0123);
view.sort((a, b) => a - b);
console.log(view.getInt32(0)); // 305419896
console.log(view.getInt32(4)); // 1145324612
console.log(view.getInt32(8)); // -1217043830
console.log(view.getInt32(12)); // -889275714

上面的代码创建了一个长度为 16 字节的 ArrayBuffer 对象,并使用 DataView 对象来读写这个缓冲区中的数据。首先,我们使用 setInt32() 方法在缓冲区的前 4 个字节写入了一个 32 位有符号整数 0x12345678。然后,我们使用 setInt32() 方法在缓冲区的第 4 个字节到第 7 个字节写入了一个 32 位有符号整数 0x87654321。接着,我们使用 setInt32() 方法在缓冲区的第 8 个字节到第 11 个字节写入了一个 32 位有符号整数 0x456789AB。最后,我们使用 setInt32() 方法在缓冲区的第 12 个字节到第 15 个字节写入了一个 32 位有符号整数 0xCDEF0123。

然后,我们使用 sort() 方法对缓冲区中的数据进行排序。sort() 方法接受一个比较函数作为参数,可以用来指定排序规则。这里我们使用默认的比较函数,它会按照升序排列数据。

最后,我们使用 getInt32() 方法读取缓冲区的前 4 个字节,得到了 305419896。接着,我们使用 getInt32() 方法读取缓冲区的第 4 个字节到第 7 个字节,得到了 1145324612。接着,我们使用 getInt32() 方法读取缓冲区的第 8 个字节到第 11 个字节,得到了 -1217043830。最后,我们使用 getInt32() 方法读取缓冲区的第 12 个字节到第 15 个字节,得到了 -889275714。

三、实际应用

1. 处理网络数据

在处理网络数据时,我们通常需要将数据转换为二进制格式,并将其发送到服务器。使用 DataView 对象,我们可以轻松地将 JavaScript 对象转换为二进制格式,并将其发送到服务器。

以下是一个简单的例子,演示如何使用 DataView 对象将 JavaScript 对象转换为二进制格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var data = {
  id: 1,
  name: '张三',
  age: 20
};

var buffer = new ArrayBuffer(12);
var view = new DataView(buffer);

view.setInt32(0, data.id);
view.setInt16(4, data.name.length);
for (var i = 0; i < data.name.length; i++) {
  view.setUint8(6 + i, data.name.charCodeAt(i));
}
view.setInt8(6 + data.name.length, data.age);
// 将二进制数据发送到服务器
2. 处理音频数据

在处理音频数据时,我们通常需要将音频数据转换为二进制格式,并将其存储到 ArrayBuffer 对象中。使用 DataView 对象,我们可以轻松地将音频数据转换为二进制格式,并将其存储到 ArrayBuffer 对象中。

以下是一个简单的例子,演示如何使用 DataView 对象将音频数据转换为二进制格式,并将其存储到 ArrayBuffer 对象中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var audioData = [0.1, 0.2, 0.3, 0.4, 0.5];

var buffer = new ArrayBuffer(audioData.length * 4);
var view = new DataView(buffer);

for (var i = 0; i < audioData.length; i++) {
  view.setFloat32(i * 4, audioData[i]);
}
// 将二进制数据存储到 ArrayBuffer 对象中

总结

DataView 对象是一个非常有用的工具,它可以帮助我们更加灵活地操作二进制数据。在实际开发中,我们可以使用 DataView 对象读取和修改二进制数据,处理不同字节顺序的数据,甚至可以读取二进制文件。掌握 DataView 对象的用法,可以让我们更加轻松地处理数据,提高开发效率。

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
js操作二进制数据
使用ArrayBuffer对象保存二进制数据,使用TypedArray和DataView 视图来读写数据。
风花一世月
2024/03/19
3560
js操作二进制数据
DOMString、Document、FormData、Blob、File、ArrayBuffer (转)
我大学那会儿,一个称为Ajax的东西对前端行业造成了深远影响,不仅是JS语言,而包括前端地位、职位兴起以及工作分工等。抛开IE6浏览器不谈,其他浏览器的Ajax实际上都是借助XMLHttpRequest实现的。
javascript.shop
2019/09/04
3K0
DOMString、Document、FormData、Blob、File、ArrayBuffer (转)
ArrayBuffer
ArrayBuffer对象、TypedArray视图和DataView视图是 JavaScript 操作二进制数据的一个接口。这些对象早就存在,属于独立的规格(2011 年 2 月发布),ES6 将它们纳入了 ECMAScript 规格,并且增加了新的方法。它们都是以数组的语法处理二进制数据,所以统称为二进制数组。 这个接口的原始设计目的,与 WebGL 项目有关。所谓 WebGL,就是指浏览器与显卡之间的通信接口,为了满足 JavaScript 与显卡之间大量的、实时的数据交换,它们之间的数据通信必须是二进制的,而不能是传统的文本格式。文本格式传递一个 32 位整数,两端的 JavaScript 脚本与显卡都要进行格式转化,将非常耗时。这时要是存在一种机制,可以像 C 语言那样,直接操作字节,将 4 个字节的 32 位整数,以二进制形式原封不动地送入显卡,脚本的性能就会大幅提升。
小小杰啊
2022/12/21
2.6K0
Blob、File、ArrayBuffer、TypedArray、DataView究竟应该如何应用
Blob、File、ArrayBuffer、TypedArray、DataView、Object URL ..等等 Web 应用中有关于进制的应用你了解多少?
19组清风
2022/05/11
2K0
Blob、File、ArrayBuffer、TypedArray、DataView究竟应该如何应用
JS中的二进制数据处理
  在现有的计算机中,二进制常常以字节数组的形式存在于程序当中。例如在C#里面,就用byte[],标准C里面没有byte类型,但可以通过typedef把byte定义为unsigned char的别名,效果是一样的。JS设计之初似乎就没想过要处理二进制,对于字节的概念可以说是非常非常的模糊。如果要表达字节数组,那么似乎只能用一个普通数组来表示。
有赞coder
2021/05/13
3.8K0
JS中的二进制数据处理
前端二进制文件处理
上一篇文章从 W3C 草案的角度入手过了一遍 File API 的几个方法,这一篇尝试梳理一下二进制数据相关的一些方法,有 Blob、ArrayBuffer、Uint8Array、BufferSource 等。
上山打老虎了
2022/06/15
1.6K0
前端二进制文件处理
WebSocket系列之JavaScript中数字数据如何转换为二进制数据
本文主要通过对JavaScript中数字数据与二进制数据之间的转换,让读者能够了解在JavaScript中如何对数字类型(包括但不限于Number类型)进行处理。
黄Java
2018/09/18
2.5K0
JavaScript中的二进制数据
在我编写 js 代码中,关于处理二进制数据了解甚少,好像都是用数组表示,但是成员又很模糊。尤其是在遇到一些 http 的 post 请求或 websocket,发送二进制数据(字节)时,还有一些算法的翻译,数据的转化,协议的复现,都需要不断的从网络上查阅,并未系统的从文档教程中入手。于是写这篇的目的就是为了加固对二进制数据的理解,以及 JavaScript 中如何操作二进制数据的。
愧怍
2022/12/27
2.4K0
万字长文带你学习【前端开发中的二进制数据】| 技术创作特训营第五期
在现代前端开发中,处理二进制数据变得越来越重要。从图像、音频到文件上传,这些数据类型常常以二进制形式存在。这个分享将带你深入探索 ArrayBuffer、Blob、File 以及流(Stream)等概念,探讨它们如何在前端开发中发挥作用,解锁了解和利用二进制数据的强大能力。
程序员库里
2024/01/24
8060
从图片裁剪来聊聊前端二进制
首先判断window.navigator.msSaveOrOpenBlob是为了兼容IE(谁要兼容这 xxIE!!)
前端森林
2020/08/21
1.7K0
从图片裁剪来聊聊前端二进制
JavaScript 高级程序设计(第 4 版)- 集合引用类型
定型数组同样使用数组缓冲来存储数据,而数组缓冲无法调整大小,故以下方法不适用于定型数组
Cellinlab
2023/05/17
7590
JavaScript中Array怎么用?
Array 是 JavaScript 的全局数组对象,其元素可以是不同类型,如果需要元素是同一类型,可使用 TypedArray。
Learn-anything.cn
2021/12/20
1.5K0
WebSocket系列之字符串如何与二进制数据间进行互相转换
上一篇博客我们说到了如何进行数字类型(如Short、Int、Long类型)如何在JavaScript中进行二进制转换,如果感兴趣的可以可以阅读本系列第二篇博客——WebSocket系列之JavaScript中数字数据如何转换为二进制数据。这次,我们来说下string类型的数据如何进行处理。 本文是WebSocket系列的第三篇,主要介绍string数据与二进制数据之间的转换方法,具体的内容如下:
黄Java
2018/09/18
5.2K0
深度学习的JavaScript基础:矩阵和向量的表示
与Java、C++这样的静态类型语言不同,JS中的变量似乎没有类型,在声明变量时不用指定变量类型。但实际上JS也有字符串、数字、布尔值、对象、数组、未定义等类型,是一种弱类型语言。在深度学习中,矩阵和向量是最基本的数据结构,而高效的矩阵和向量运算是深度学习计算中的关键。在C++中,数组可用于表示矩阵或向量,JS中也有这样的数据结构吗?
云水木石
2019/12/18
2.3K0
JS中Buffer数据详解
随着WebSocket、WebAudio、Ajax2等广泛应用,前端方面只要是处理大数据或者想提高数据处理性能,那一定是少不了 ArrayBuffer对象
jinghong
2020/05/09
6.8K0
使用ES6新特性开发微信小程序(4)
Symbol Type ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的第七种数据类型,前六种是:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。 Symbol值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的Symbol类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。 let s =
极乐君
2018/02/05
1.8K0
【前端知乎系列】ArrayBuffer 和 Blob 对象
ArrayBuffer 对象与 Blob 对象大家或许不太陌生,常见于文件上传操作处理(如处理图片上传预览等问题)。
pingan8787
2019/12/16
2.2K0
【前端知乎系列】ArrayBuffer 和 Blob 对象
Webassembly初识
首先,它是一种解释性语言,大神最开始的设计目标用户就是“非专业编程人员和设计师”,避免了非专业人士对编译器了解的需要,解释性语言就是边解释边执行,与编译性语言的先编译后执行相比,执行速度慢了很多;
CIKEY
2019/03/18
1.1K0
【前端知乎】443- ArrayBuffer 与 Blob 对象详解
ArrayBuffer 对象是 ES6 才纳入正式 ECMAScript 规范,是 JavaScript 操作二进制数据的一个接口。ArrayBuffer 对象是以数组的语法处理二进制数据,也称二进制数组。
pingan8787
2019/12/24
1.9K0
【前端知乎】443- ArrayBuffer 与 Blob 对象详解
web 直播流的解析
本文作者:ivweb villainthr Web 进制操作是一个比较底层的话题,因为平常做业务的时候根本用不到太多,或者说,根本用不到。 老铁,没毛病 那什么情况会用到呢? canvas webso
腾讯IVWEB团队
2017/07/14
4K2
web 直播流的解析
相关推荐
js操作二进制数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验