1.1Nodejs和浏览器中的二进制处理

news2025/6/7 16:53:58

Buffer

在 Node.js 中,Buffer 类用于处理二进制数据。由于 JavaScript 在浏览器环境中主要用于处理字符串和数字等类型的数据,对二进制数据的处理能力较弱,因此 Node.js 引入了 Buffer 类来弥补这一不足,特别是在处理文件系统操作、网络流等方面时。

Buffer 的基本概念

  • 固定大小:一旦创建,Buffer 实例的大小是固定的,不能调整。
  • 存储整数:每个 Buffer 实例都是一个包含 8 位无符号整数值(0 到 255)的数组。
  • 高效性:设计用来高效地存储和操作二进制数据。

Buffer不指定编码,默认转换时是 uft8编码

创建 Buffer

  1. 从字符串创建

    const buf = Buffer.from('hello', 'utf8');
  2. 从数组创建

    const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
  3. 分配指定大小的 Buffer

     

    注意,直接使用 Buffer 构造函数或 .allocUnsafe() 分配内存时不初始化内存,可能包含敏感数据,建议使用 .alloc() 方法:

    const buf = Buffer.alloc(10); // 创建一个长度为 10,值全为 0 的 Buffer

操作 Buffer

  • 读写数据

     

    可以通过索引直接访问或修改 Buffer 中的数据:

    buf[0] = 0x62; // 修改第一个字节
    console.log(buf[0]); // 读取第一个字节
  • 转换

     

    转换为其他格式如字符串:

    const str = buf.toString('utf8');

其他常用方法

  • buf.length: 获取 Buffer 的字节长度。
  • buf.equals(otherBuffer): 检查两个 Buffer 是否相等。
  • buf.compare(otherBuffer): 比较两个 Buffer,类似于字符串比较。
  • buf.slice([start[, end]]): 返回一个新的 Buffer,它与原 Buffer 共享相同的内存区域,但偏移量不同。
  • buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]]): 将 Buffer 的一部分复制到另一个 Buffer。

注意事项

  • 处理 Buffer 时需要特别小心,因为它们可以直接访问内存,不正确的使用可能导致安全问题或内存泄漏。
  • 使用 Buffer 时应尽量避免使用未初始化的内存,即优先选择 Buffer.alloc() 而不是 Buffer.allocUnsafe()

Buffer 是 Node.js 中处理二进制数据的重要工具

浏览器中的二进制数据处理

在浏览器环境中,原生并不支持 Node.js 的 Buffer 类,因为 Buffer 是 Node.js 特有的用于处理二进制数据的类,主要用于服务器端开发。然而,在浏览器中,如果你需要处理二进制数据,可以使用 JavaScript 提供的几种内置对象和类型,例如 ArrayBufferTypedArray(如 Uint8Array)和 Blob 等。

  1. ArrayBuffer:一个固定长度的字节数组,不能直接操作其内容,而是通过视图(views)来读写数据。

  2. TypedArray:包括 Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, 和 Float64Array 等,提供了以特定格式访问 ArrayBuffer 数据的方法。

  3. DataView:提供了一个底层接口,用于访问 ArrayBuffer 中的数据,允许以不同的格式读写数据。

  4. Blob:代表不可变的、原始数据的类文件对象,基于输入的数据创建一个包含指定类型的二进制数据的对象。

  5. TextEncoder 和 TextDecoder:用于在字符串与 Uint8Array 之间进行转换。(我们在base64编码里使用过.6.6js对base64编码解码_js base64-CSDN博客)

ArrayBuffer

  • ArrayBuffer 本身是不可变的,意味着一旦创建,其大小不能更改。
  • 字节单位ArrayBuffer 的容量是以字节为单位的,因此当你创建一个 ArrayBuffer 时,需要指定它的大小(以字节为单位)。
  • 访问数据:直接使用 ArrayBuffer 并不容易,通常会通过视图(views),如 TypedArray 或者 DataView 来读取或写入其中的数据。
创建 ArrayBuffer

可以通过构造函数创建一个新的 ArrayBuffer

const buffer = new ArrayBuffer(16); // 创建一个包含16个字节的缓冲区
console.log(buffer.byteLength); // 输出: 16
TypedArray 视图

为了方便地操作 ArrayBuffer 中的数据,JavaScript 提供了多种类型的 TypedArray,每种类型对应不同的数值格式(例如整数、浮点数)和大小(例如8位、16位)。常用的 TypedArray 包括:

  • Int8Array
  • Uint8Array
  • Uint8ClampedArray
  • Int16Array
  • Uint16Array
  • Int32Array
  • Uint32Array
  • Float32Array
  • Float64Array
const buffer = new ArrayBuffer(16);
const uint8 = new Uint8Array(buffer); // 使用Uint8Array作为视图
uint8[0] = 42; // 设置第一个字节的值为42
console.log(uint8[0]); // 输出: 42
DataView 视图

除了 TypedArray,还可以使用 DataView 对象来读取和写入 ArrayBuffer 中的数据。DataView 提供了更加灵活的方法来处理不同大小和格式的数据,允许你在同一个 ArrayBuffer 上混合使用不同的数据类型。

const buffer = new ArrayBuffer(16);
const view = new DataView(buffer);
view.setUint8(0, 42); // 在偏移量为0的位置设置一个无符号8位整数
console.log(view.getUint8(0)); // 输出: 42

FileReader 读取文件并获取 ArrayBuffer

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <title>FileReader 读取 ArrayBuffer 示例</title>
</head>
<body>

<h2>请选择一个文件:</h2>
<input type="file" id="fileInput" />

<pre id="output"></pre>

<script>
  document.getElementById('fileInput').addEventListener('change', function(event) {
    const file = event.target.files[0]; // 获取用户选择的第一个文件

    if (!file) {
      alert("请先选择一个文件!");
      return;
    }

    const reader = new FileReader();

    // 当读取完成时触发
    reader.onload = function(e) {
      const arrayBuffer = e.target.result; // result 是 ArrayBuffer 类型

      // 打印 ArrayBuffer 和它的长度
      console.log("ArrayBuffer:", arrayBuffer);
      console.log("字节长度:", arrayBuffer.byteLength);

      // 可选:将 ArrayBuffer 转换为 Uint8Array 查看前几个字节
      const uint8Array = new Uint8Array(arrayBuffer);
      const firstBytes = uint8Array.slice(0, 20); // 前20个字节
      document.getElementById('output').textContent =
        "前20个字节(十六进制):\n" +
        Array.prototype.map.call(firstBytes, b => ('00' + b.toString(16)).slice(-2)).join(' ');
    };

    // 开始读取文件为 ArrayBuffer
    reader.readAsArrayBuffer(file);
  });
</script>

</body>
</html>

  • FileReader 是浏览器提供的用于异步读取文件内容的 API。
  • readAsArrayBuffer(file) 方法会将整个文件读取为一个 ArrayBuffer
  • reader.onload 回调中,e.target.result 就是读取到的 ArrayBuffer
  • 使用 Uint8Array 可以查看或操作原始二进制数据。
  • 这种方式非常适合用来解析各种二进制格式,如:
    • 图片文件(PNG/JPG)
    • PDF 文件
    • 音频/视频文件
    • 自定义二进制协议的数据包等

Node.js 中的 ArrayBuffer

在 Node.js 中也有 ArrayBuffer,它允许你处理通用的、固定长度的二进制数据缓冲区。ArrayBuffer 是 JavaScript 中的一个底层接口,用于表示一段连续的内存区域,这段内存不能直接操作,通常需要通过视图(如 TypedArray 或者 DataView)来访问和操作其中的数据。

在早期版本中,Node.js 和浏览器环境对于 ArrayBuffer 的支持存在一些差异,但是随着技术的发展,现在 Node.js 已经对 ArrayBuffer 提供了很好的支持,并且可以与浏览器环境兼容使用。这意味着你可以利用 ArrayBuffer 来处理文件、网络流等场景中的二进制数据。

在 Node.js 中使用 ArrayBuffer

const buffer = new ArrayBuffer(8); // 创建一个包含8个字节的缓冲区
console.log(buffer.byteLength); // 输出: 8


使用 TypedArray 访问 ArrayBuffer


要读取或写入 ArrayBuffer 中的数据,通常需要使用 TypedArray,例如 Uint8Array。

const buffer = new ArrayBuffer(8);
const view = new Uint8Array(buffer);

// 写入数据
for (let i = 0; i < view.length; i++) {
  view[i] = i;
}

// 读取数据
for (let i = 0; i < view.length; i++) {
  console.log(view[i]);
}


使用 DataView 访问 ArrayBuffer


如果你需要以不同的格式读取和写入数据(比如不同大小的整数或浮点数),可以使用 DataView。


const buffer = new ArrayBuffer(16);
const dataView = new DataView(buffer);

// 写入不同类型的数据
dataView.setUint8(0, 255);
dataView.setFloat32(4, Math.PI);

// 读取数据
console.log(dataView.getUint8(0)); // 输出: 255
console.log(dataView.getFloat32(4)); // 输出接近: Math.PI


这些例子展示了如何在 Node.js 中创建和操作 ArrayBuffer。无论你是处理文件 I/O、网络通信还是其他涉及二进制数据的操作,ArrayBuffer 都是一个非常强大的工具。此外,由于 Node.js 对 ArrayBuffer 的良好支持,使得从浏览器端到服务器端处理二进制数据变得更加统一和方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2403131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

入门AJAX——XMLHttpRequest(Post)

一、前言 在上篇文章中&#xff0c;我们已经介绍了 HMLHttpRequest 的GET 请求的基本用法&#xff0c;并基于我提供的接口练习了两个简单的例子。如果你还没有看过第一篇文章&#xff0c;强烈建议你在学习完上篇文章后再学习本篇文章&#xff1a; &#x1f517;入门AJAX——XM…

Qt(part1)Qpushbutton,信号与槽,对象树,自定义信号与槽,lamda表达式。

1、创建Qt程序 2、命名规范及快捷键 3、Qpushbutton按钮创建 4、对象树概念 5、信号与槽 6、自定义信号与槽 7、当自定义信号和槽发生重载时 8、信号可以连接信号&#xff0c;信号也可以断开。 9、lamda表达式

西北某省级联通公司:3D动环模块如何实现机房“一屏统管”?

一、运营商机房监控痛点凸显 在通信行业快速发展的当下&#xff0c;西北某省级联通公司肩负着保障区域通信畅通的重任。然而&#xff0c;公司分布广泛的机房面临着诸多监控难题&#xff0c;尤其是偏远机房环境风险无法实时感知这一痛点&#xff0c;严重影响了机房的稳定运行和通…

视觉分析在人员行为属性检测中的应用

基于视觉分析的人员行为属性检测方案 一、背景与需求分析 在工业生产、建筑施工、公共安全等领域&#xff0c;人员行为属性的合规性检测是保障安全生产的关键环节。例如&#xff0c;工地工人未佩戴安全帽、厨房人员未佩戴手套、作业现场人员使用手机等行为&#xff0c;均可能…

电子行业AI赋能软件开发经典案例——某金融软件公司

01.案例标题 金融行业某金融软件公司通过StarShip CodeSouler达成效率突破性增长&#xff0c;零流程侵入验证AI代码高度可行性 02.执行摘要 某金融软件公司在核心产品研发中引入开放传神&#xff08;OpenCSG&#xff09;的StarShip CodeSouler AI代码生成平台&#xff0c;在无…

摆脱硬件依赖:SkyEye在轨道交通中的仿真应用

在城市轨道交通系统中&#xff0c;信号系统承担着确保列车安全、高效运行的关键任务。从排列进路、信号开放&#xff0c;到终点折返与接发车&#xff0c;几乎每一个调度动作背后都依赖于信号系统的精密控制与实时响应。作为信号系统的重要组成部分&#xff0c;目标控制器&#…

使用变异系数增强 CFD 收敛标准

将描述性统计整合到 CFD 中&#xff0c;以评估可变性和收敛性。 挑战 在工程设计中&#xff0c;尤其是在进行仿真时&#xff0c;我们经常处理描述流体、温度、应力或浓度行为的大型数据集。以有意义的方式解释这些值需要的不仅仅是原始数字;它需要对统计的理解。 统计学在工程…

物联网通信技术全景指南(2025)之如何挑选合适的物联网模块

物联网通信技术全景指南&#xff08;2025&#xff09;之 如何挑选合适的物联网模块 物联网通信技术全景指南&#xff08;2025&#xff09;一、技术代际演进与退网背景二、5G 物联网技术体系&#xff08;Sub-6 GHz 核心&#xff09;1. 技术分层架构2. 蜂窝技术性能矩阵3. Sub-6 …

影楼精修-AI衣服祛褶皱算法解析

注&#xff1a;为避免侵权&#xff0c;本文所用图像均为AIGC生成或无版权网站提供&#xff1b; 衣服祛褶皱功能&#xff0c;目前在像素蛋糕、美图云修、百度网盘AI修图、阿里云都有相关的功能支持&#xff0c;它的价值就是将不平整的衣服图像&#xff0c;变得整齐平整&#xf…

Day46 Python打卡训练营

知识点回顾&#xff1a; 1. 不同CNN层的特征图&#xff1a;不同通道的特征图 2. 什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。 3. 通道注意力&#xff1a;模型的定义和插入的位置 4. 通道注意力后…

linux安全加固(非常详细)

安全加固方案原则 1.版本升级 对于系统和应用在使用过程中暴露的安全缺陷&#xff0c;系统或应用厂商会及时发布解决问题的升级补丁包。升级系统或应用版本&#xff0c;可有效解决旧版本存在的安全风险。2.关闭端口服务 在不影响业务系统正常运行情况下&#xff0c;停止或禁用承…

动手学深度学习12.7. 参数服务器-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;35 分布式训练【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;12.7. 参数服务器…

告别数据泥沼,拥抱智能中枢:King’s四位一体重塑科研生产力

在现代科研的战场上&#xff0c;数据堪称科研人员手中的“弹药”。然而&#xff0c;许多实验室却深陷数据管理的泥沼&#xff1a;硬盘里堆满了不同年份的实验记录&#xff0c;U盘里塞着各种格式的谱图&#xff0c;Excel表格里还留着手动计算的痕迹……&#xff0c;当科研人员想…

智绅科技 —— 智慧养老 + 数字健康,构筑银发时代安全防护网

在老龄化率突破 21.3% 的当下&#xff0c;智绅科技以 "科技适老" 为核心理念&#xff0c;构建 "监测 - 预警 - 干预 - 照护" 的智慧养老闭环。 其自主研发的七彩喜智慧康养平台&#xff0c;通过物联网、AI 和边缘计算技术&#xff0c;实现对老年人健康与安…

Code Composer Studio CCS 工程设置,如何设置h文件查找路径?

右键工程,选Properties,在Build>MSP430 Compiler>Optinizution Include Options 设置头文件的搜索路径。 比如我设置了这些: ${CCS_BASE_ROOT}/msp430/include ${PROJECT_ROOT} ${CG_TOOL_ROOT}/include "${workspace_loc:/${ProjName}/F5xx_F6xx_Core_Lib}&quo…

Qt生成日志与以及捕获崩溃文件(mingw64位,winDbg)————附带详细解说

文章目录 Qt生成日志与以及报错文件(mingw64位&#xff0c;winDbg)0 背景与结果0.1 背景0.2 结果1 WinDbg1.1 安装1.2 使用 2 编写代码2.1 ccrashstack类2.2 编写输出捕获异常的dmp文件2.2 编写输出日志文件2.3 调用生成日志和dmp文件 参考 Qt生成日志与以及报错文件(mingw64位…

智能手表健康监测系统的PSRAM存储芯片CSS6404LS-LI—高带宽、耐高温、微尺寸的三重突破

一、直击智能手表三大核心痛点 痛点场景风险传统方案缺陷连续生物数据流存储100Hz PPG信号产生82MB/s数据洪峰SPI NOR Flash带宽不足(≤50MB/s)高温环境稳定性腕表表面温度达50℃&#xff08;烈日/运动场景&#xff09;商用级存储器件(85℃)易触发数据错误极限空间约束PCB面积…

蓝桥杯国赛题2022

首先这个题应该是一个01背包&#xff0c;背包容量为2022&#xff0c;有2022个物品&#xff0c;第i个物品的体积为i&#xff0c;只不过这里有两个限制条件&#xff0c;一个限制条件是和为2022&#xff0c;另一个限制条件为10个数&#xff0c;两个限制条件那就把加一维&#xff0…

关于如何使用VScode编译下载keil工程的步骤演示

1、vscode的插件市场下载keil Assistant 2 、点设置 3、复制keil的地址 4、粘贴到第…

Redis底层数据结构之深入理解跳表(2)

上一篇文章中我们详细讲述了跳表的增添、查找和修改的操作&#xff0c;这篇文章我们来讲解一下跳表在多线程并发时的安全问题。在Redis中&#xff0c;除了网络IO部分和大文件的后台复制涉及到多线程外&#xff0c;其余任务执行时全部都是单线程&#xff0c;这也就意味着在Redis…