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

yizhihongxing

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日

相关文章

  • JS下载文件|无刷新下载文件示例代码

    JS下载文件|无刷新下载文件示例代码是一种实现在前端页面中通过JavaScript代码实现下载文件的方法。下面,我将会详细讲解如何实现这个功能,过程中会提供两条示例说明。 1. 实现思路 要实现通过JS实现下载文件的功能,我们需要通过创建XMLHttpRequest对象实现文件下载。 具体的实现过程如下: 创建XMLHttpRequest对象。 通过XMLH…

    JavaScript 2023年5月27日
    00
  • JSP单选按钮验证、下拉框验证、复选框验证实现代码

    JSP单选按钮验证、下拉框验证、复选框验证实现代码可以通过JavaScript实现。以下是具体步骤和示例说明: 单选按钮验证 步骤: (1)在HTML表单中给每个单选按钮设置相同的name属性,不同的value属性,这样它们就属于同一组。 (2)在JavaScript中获取单选按钮组的元素,使用for循环遍历,判断哪个按钮被选中。 (3)根据选中的单选按钮进…

    JavaScript 2023年6月10日
    00
  • js常用的键盘事件有哪些(用法示例)_键码keyCode对照表

    下面就针对题目中提到的问题进行详细的讲解。 1. JS常用的键盘事件有哪些 在 JS 中,常用的键盘事件包括:keydown、keypress 和 keyup。它们分别表示键盘按下、按住不放和松开三个状态。其中,keydown 和 keyup 的响应速度比较快,但是无法获取到按住不放的过程;keypress 响应相对较慢,但能够获取按住不放的过程。一般情况下…

    JavaScript 2023年6月1日
    00
  • javascript异步处理工作机制详解

    Javascript异步处理工作机制详解 异步处理是Javascript中的重要概念,它允许代码在等待I/O事件、AJAX请求等等时不阻塞当前线程。本文将介绍Javascript中的异步处理机制及其实现方式。 回调函数 Javascript中最常用的方式实现异步编程是使用回调函数。简单来说,在一个异步函数完成后,会执行一个回调函数,这个回调函数就是异步函数的…

    JavaScript 2023年6月11日
    00
  • JavaScript中使用Spread运算符的八种方法总结

    下面我将详细讲解“JavaScript中使用Spread运算符的八种方法总结”的完整攻略。 什么是Spread运算符 Spread运算符是ES6中新引入的一种运算符,由三个连续的点符号…组成。它可以将一个可迭代对象(如数组或者字符串)展开成单个元素,或将多个元素指定为数组的元素,具有非常强大的功能。语法如下: // 展开数组成为元素 […array]…

    JavaScript 2023年5月27日
    00
  • js闭包实例汇总

    JS闭包实例汇总 在 JavaScript 中,函数是一等公民,它们可以被传递、被赋值、被嵌套定义等等。在函数内定义的函数,被称为闭包(Closure)。闭包可以访问函数外部的变量,而且在函数执行完并返回时,可以保留这些变量的值。 本文将为大家汇总几个 JavaScript 闭包的实例,方便大家加深对闭包的理解。 示例一:计数器 我们可以通过闭包来创建一个计…

    JavaScript 2023年6月10日
    00
  • js通过地址栏给action传值(中文乱码全是问号)

    当我们通过地址栏传递参数给 action 时,由于中文默认编码方式是 UTF-8,而 action 接收到的参数为 GBK 编码方式,导致中文乱码问题。下面是完整的攻略步骤: 1. 使用 JavaScript 的 escape() 函数编码传递的中文参数 escape() 函数可以将字符串进行编码,使其在传输时不受特殊字符的影响。我们可以将要传递的中文参数使…

    JavaScript 2023年5月19日
    00
  • Fuse.js模糊查询算法学习指南

    Fuse.js模糊查询算法学习指南 算法简介 Fuse.js是一款用于快速模糊搜索的JavaScript库。它使用了一种称为模糊查询算法的算法,能够在无需进行复杂的文件预处理或搜索索引的情况下,在大量数据中高效地进行模糊搜索。 Fuse.js算法的流程如下: 初始化:将查询的关键字转化为需要搜索的模式。 评估:根据搜索模式计算每个文本的匹配程度。 排序:将文…

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