JavaScript中各种二进制对象关系的深入讲解

JavaScript中各种二进制对象关系的深入讲解

Buffer

在 Node.js 中,Buffer 类被用来在 TCP 流、文件系统操作、以及其他上下文中处理二进制数据流。

创建 Buffer

Buffer 可以通过多种方式创建,在以下的代码片段中,我们来看如何创建一个空的 Buffer 对象。

const buf1 = Buffer.alloc(5);
console.log(buf1);
// 输出:<Buffer 00 00 00 00 00>

在上面的代码造片段中,我们使用 Buffer.alloc() 函数,创建一个大小为5的空 Buffer 对象 buf1。Buffer 类中对应的成员函数总共包含4种:

  • Buffer.alloc(size[, fill[, encoding]]): 创建一块Buffer空间,并全部用fill初始化,fill默认是0,encoding默认是utf8编码.
  • Buffer.allocUnsafe(size): 创建一块Buffer堆内存,但是没有初始化.
  • Buffer.allocUnsafeSlow(size): 创建一块未初始化的Buffer内存.
  • Buffer.from(array): 根据参数生成一个新的 Buffer 对象。

写入和读出 Buffer

我们可以使用 buffer.write(string[, offset[, length]][, encoding]) 函数来写入字符串到指定的 Buffer 对象中。

const buf2 = Buffer.alloc(5);
buf2.write("Hello");
console.log(buf2);
// 输出:<Buffer 48 65 6c 6c 6f>

在上面的代码片段中,我们在创建了一个 5 个字节大小的空 Buffer 对象 buf2 后,使用 buf2.write("Hello") 写入了字符串 "Hello",这里默认采用 utf8 编码(它是Buffer默认的编码方式)。

要打印出这个 Buffer 对象,我们使用 console.log,看到一个新的数字数组 [ 72, 101, 108, 108, 111 ]。这些数字代表了每个字符对应的 ASCII 码。

反过来,我们可以使用 buffer.toString() 函数把 Buffer 对象转换回字符串。

const buf3 = Buffer.from([72, 101, 108, 108, 111]);
console.log(buf3.toString());
// 输出:Hello

操作 Buffer

对于 Buffer 对象,我们可以使用三个函数 readInt8readUInt8writeUInt8 来读写其字节内容。

const buf4 = Buffer.alloc(2);
buf4.writeUInt8(16, 0);
buf4.writeUInt8(64, 1);
console.log(buf4.readUInt8(0));
console.log(buf4.readUInt8(1));
// 输出:16, 64

在上面的代码片段中,我们创建了一个大小为 2 个字节的 Buffer 对象 buf4,并使用 buf4.writeUInt8(16,0)buf4.writeUInt8(64,1) 分别向前两个字节写入了 16 和 64 两个数字。然后,我们使用 buf4.readUInt8(0)buf4.readUInt8(1) 分别读取了前两个字节的内容。

ArrayBuffer & DataView

ArrayBuffer 和 DataView 是 HTML5 中新增的 TypedArray 的基础,用来处理二进制数据流。

ArrayBuffer

ArrayBuffer 对象用来表示一个通用的、固定长度的二进制数据缓冲区。在创建 ArrayBuffer 对象时,需要指定分配的内存大小(即容量),创建后,它们不能更改。

let buffer = new ArrayBuffer(16) // 创建一个大小为 16 个字节的 ArrayBuffer 对象
console.log(buffer.byteLength) // 输出:16

在上面的例子中,我们创建了一个大小为 16 个字节的 ArrayBuffer 对象,并且输出其占用的字节数,即16。

在 ArrayBuffer 对象中无法直接操作数据以及读取和写入,我们需要使用 DataView 对象来进行操作。

DataView

DataView 对象是一个用来读写 ArrayBuffer 的接口。与直接操作 ArrayBuffer 不同的是,DataView 可以针对不同的字节序进行解析,它可以指定数据在数组中的位置、以及数据的字节大小。

let buffer = new ArrayBuffer(16) // 创建一个大小为16字节的 ArrayBuffer 对象
let dataView = new DataView(buffer) // 创建一个针与buffer对前的 DataView 对象
dataView.setInt8(0, 1) // 将位置0的字节 编辑为1
dataView.setInt16(1, 37) // 将位置1到2的两个字节依次编辑为 0x0025,注意第一位是零

console.log(dataView.getInt8(0))  // 读取位置0的值,输出:1
console.log(dataView.getInt16(1)) // 读取位置1到2的2个字节,输出:37

在上面的例子中,我们创建了一个大小为 16 个字节的 ArrayBuffer 对象,并创建一个 DataView 对象来处理该 ArrayBuffer。我们使用 dataView.setInt8(0, 1) 将第一位字节位置上的值为 1。然后使用 dataView.setInt16(1, 37) 将第二、第三位字节位置上的值依次为 0x25

最后,我们使用 dataView.getInt8(0)dataView.getInt16(1)分别读取类第一位字节和后两位字节,得到的值分别为 137

示例说明

  1. 实现一个往 ArrayBuffer 对象中写入和读出数据的示例
const buffer = new ArrayBuffer(8);
const dataView = new DataView(buffer);

// 往buffer中写入一些数据
dataView.setInt16(0, 256);
dataView.setInt32(2, 1024);

// 从buffer中读出数据
console.log(dataView.getInt16(0)); // 输出:256
console.log(dataView.getInt32(2)); // 输出:1024

在上面的例子中,我们创建了一个大小为 8 字节的 ArrayBuffer 对象,并通过 DataView 对象 dataView 来写入 2561024 两个整型数。

  1. 实现一个从 Buffer 对象中复制数据到 ArrayBuffer 对象的示例
const buf = Buffer.from('this is a test');
const arrayBuffer = new ArrayBuffer(buf.length);

const view = new Uint8Array(arrayBuffer);
for (let i = 0; i < buf.length; i++) {
  view[i] = buf[i];
}

console.log(view);

在上面的例子中,我们创建了一个大小等同于 buf 的 ArrayBuffer 对象 arrayBuffer,并通过 view[i] = buf[i]buf 中每个字节的数据都复制到 arrayBuffer 中,然后通过 console.log(view) 方法,打印出 arrayBuffer 内容。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript中各种二进制对象关系的深入讲解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • Javascript Date setTime() 方法

    以下是关于JavaScript Date对象的setTime()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的setTime()方法 JavaScript Date对象的setTime()方法设置对象的时间部分。该方法接受一个整数,表示自1970年1月1日00:00:00 UTC以来的毫秒数。如果参数超出了JavaScript所能表…

    JavaScript 2023年5月11日
    00
  • js 调用本地exe的例子(支持IE内核的浏览器)

    下面将详细讲解“JS 调用本地 EXE 的例子(支持 IE 内核的浏览器)”的完整攻略,并提供两条示例。 准备工作 在进行本地 EXE 执行前,需要进行以下准备工作: 在服务器上放置本地 EXE 程序。 使用本地服务器,将前端代码放置于本地服务器上,这样才能执行本地 EXE 程序。 使用 IE 内核的浏览器,否则无法执行本地 EXE 程序。 JS 调用本地 …

    JavaScript 2023年5月27日
    00
  • 异步安全加载javascript文件的方法

    异步安全加载JavaScript文件是指在保证网页性能和用户体验的同时,确保JavaScript代码能够无误地执行。下面是异步安全加载JavaScript文件的方法: 1. 异步加载JavaScript文件 异步加载JavaScript文件可以使用HTML5中的script标签,并且设置async属性。这样浏览器会异步加载脚本,不会阻塞网页的渲染,同时脚本在…

    JavaScript 2023年5月27日
    00
  • JavaScript 匿名函数(anonymous function)与闭包(closure)

    JavaScript 匿名函数(anonymous function)与闭包(closure)是 JavaScript 语言中比较常用且常误解的概念。在本文中,我们将详细介绍匿名函数与闭包的概念、用法及其注意事项。 匿名函数 概念 匿名函数是指没有函数名的函数。在 JavaScript 中,我们通常通过函数表达式来定义匿名函数。如下所示: const add…

    JavaScript 2023年5月27日
    00
  • 基于JS实现带动画效果的流程进度条

    确定需求首先,确定流程进度条的需求,包括显示步骤数量、当前进度、进度条颜色等。根据需求,将进度条分为若干等份,每个等份代表一个步骤。 HTML结构根据上一步的需求,构建进度条的HTML结构,一般采用<ul>标签嵌套<li>标签的方式,每个<li>代表一个步骤,根据步骤的完成情况设定不同的类名。 示例1: <ul cl…

    JavaScript 2023年6月10日
    00
  • 深入理解JS函数的参数(arguments)的使用

    下面是深入理解JS函数参数(arguments)的使用攻略。 1. 什么是JS函数参数(arguments)? 在JS函数中,我们可以使用参数(argument)来接收外部传入的数据,这些参数被封装在一个类数组对象arguments中。arguments是代表传入函数的参数的对象,可以通过它访问函数的形参和实参。 2. arguments对象方法 argum…

    JavaScript 2023年5月27日
    00
  • 基于canvas实现的钟摆效果完整实例

    下面我将为你详细讲解“基于canvas实现的钟摆效果完整实例”的完整攻略。 1. 需求和准备工作 首先我们需要明确需要实现的功能,即基于canvas实现一个可以进行摆动的钟摆效果。接下来需要准备一些工作如下: 编写HTML文件,引入canvas画布和JS脚本文件 编写JS代码实现钟摆效果 在HTML文件中生成一个canvas画布 2. 实现步骤 2.1 创建…

    JavaScript 2023年6月11日
    00
  • JavaScript事件学习小结(二)js事件处理程序

    以下是“JavaScript事件学习小结(二)js事件处理程序”攻略的详细讲解: 简介 JavaScript中事件处理程序是指在用户与网页交互时由浏览器调用的函数。事件处理程序通常用来响应用户的点击、鼠标移动、键盘输入等行为。 事件处理程序的三种方式 JavaScript中有三种方式定义事件处理程序: 直接在HTML标签中使用内联事件处理程序; 在JS脚本中…

    JavaScript 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部