JavaScript 的ArrayBuffer 和二进制数组

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》

​ 

✨ 前言

✨ 正文

简介

在 JavaScript 中,ArrayBuffer 对象代表一段固定长度的原始二进制数据。它可以用作存储各种类型的数据,例如图像、音频和视频数据。

二进制数组TypedArray 对象的实例,它提供了一种更方便的方式来处理 ArrayBuffer 中的数据。二进制数组提供了一种类似于普通数组的语法,但它可以存储不同类型的二进制数据,例如整数、浮点数和字节。

ArrayBuffer 的用途:

  • 存储图像、音频和视频数据
  • 在网络上发送和接收二进制数据
  • 在浏览器中实现低级算法

二进制数组的用途:

  • 处理图像、音频和视频数据
  • 在网络上发送和接收二进制数据
  • 在浏览器中实现低级算法

创建 ArrayBuffer 和二进制数组

可以使用以下方法创建 ArrayBuffer 对象:

  • 使用 new ArrayBuffer() 构造函数
  • 使用 ArrayBuffer.from() 方法从其他数据源创建 ArrayBuffer 对象

可以使用以下方法创建二进制数组:

  • 使用 new TypedArray() 构造函数
  • 使用 TypedArray.from() 方法从其他数据源创建二进制数组

使用 ArrayBuffer 和二进制数组

以下是一些使用 ArrayBuffer 和二进制数组的示例:

  • 存储图像数据
    // 创建一个 ArrayBuffer 对象来存储图像数据
    var arrayBuffer = new ArrayBuffer(1024);
    
    // 创建一个 Uint8Array 对象来表示图像数据
    var uint8Array = new Uint8Array(arrayBuffer);
    
    // 将图像数据复制到 Uint8Array 对象中
    uint8Array.set([0, 255, 0, 255, 0, 255, 0, 255]);
    
    // 使用图像数据创建图像
    var image = new Image();
    image.src = 'data:image/png;base64,' + btoa(String.fromCharCode.apply(null, uint8Array));
    
    // 将图像添加到页面中
    document.body.appendChild(image);
    

  • 在网络上发送和接收二进制数据
    // 创建一个 ArrayBuffer 对象来存储要发送的数据
    var arrayBuffer = new ArrayBuffer(1024);
    
    // 创建一个 Uint8Array 对象来表示要发送的数据
    var uint8Array = new Uint8Array(arrayBuffer);
    
    // 将数据复制到 Uint8Array 对象中
    uint8Array.set([1, 2, 3, 4, 5]);
    
    // 使用 XMLHttpRequest 发送数据
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/api/data');
    xhr.setRequestHeader('Content-Type', 'application/octet-stream');
    xhr.send(arrayBuffer);
    
    // 接收数据
    xhr.onload = function() {
      // 将接收到的数据转换为 ArrayBuffer 对象
      var arrayBuffer = xhr.response;
    
      // 创建一个 Uint8Array 对象来表示接收到的数据
      var uint8Array = new Uint8Array(arrayBuffer);
    
      // 处理接收到的数据
      console.log(uint8Array);
    };
    

  • 在浏览器中实现低级算法
    // 创建一个 ArrayBuffer 对象来存储要排序的数据
    var arrayBuffer = new ArrayBuffer(1024);
    
    // 创建一个 Int32Array 对象来表示要排序的数据
    var int32Array = new Int32Array(arrayBuffer);
    
    // 将数据复制到 Int32Array 对象中
    int32Array.set([5, 2, 4, 6, 1, 3]);
    
    // 使用冒泡排序算法对数据进行排序
    function bubbleSort(array) {
      for (var i = 0; i < array.length - 1; i++) {
        for (var j = 0; j < array.length - i - 1; j++) {
          if (array[j] > array[j + 1]) {
            var temp = array[j];
            array[j] = array[j + 1];
            array[j + 1] = temp;
          }
        }
      }
    }
    
    // 对数据进行排序
    bubbleSort(int32Array);
    
    // 打印排序后的数据
    console.log(int32Array);
    

附加内容

代码示例

以下是一些额外的代码示例,展示了如何使用 ArrayBuffer 和二进制数组来处理不同类型的数据:

读取图像数据

// 创建一个 ArrayBuffer 对象来存储图像数据
var arrayBuffer = new ArrayBuffer(1024);

// 创建一个 Uint8Array 对象来表示图像数据
var uint8Array = new Uint8Array(arrayBuffer);

// 将图像数据复制到 Uint8Array 对象中
uint8Array.set([0, 255, 0, 255, 0, 255, 0, 255]);

// 使用图像数据创建图像
var image = new Image();
image.src = 'data:image/png;base64,' + btoa(String.fromCharCode.apply(null, uint8Array));

// 将图像添加到页面中
document.body.appendChild(image);

// 读取图像数据
var canvas = document.createElement('canvas');
canvas.width = image.width;
canvas.height = image.height;
var context = canvas.getContext('2d');
context.drawImage(image, 0, 0);

// 获取图像数据
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);

// 将图像数据转换为 ArrayBuffer 对象
var arrayBuffer = imageData.data.buffer;

// 创建一个 Uint8Array 对象来表示图像数据
var uint8Array = new Uint8Array(arrayBuffer);

// 处理图像数据
console.log(uint8Array);

在网络上发送和接收 JSON 数据

// 创建一个 JSON 对象
var jsonData = {
  name: 'John Doe',
  age: 30
};

// 将 JSON 对象转换为 ArrayBuffer 对象
var arrayBuffer = JSON.stringify(jsonData).toBuffer();

// 使用 XMLHttpRequest 发送数据
var xhr = new XMLHttpRequest();
xhr.open('POST', '/api/data');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(arrayBuffer);

// 接收数据
xhr.onload = function() {
  // 将接收到的数据转换为 ArrayBuffer 对象
  var arrayBuffer = xhr.response;

  // 将 ArrayBuffer 对象转换为 JSON 对象
  var jsonData = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)));

  // 处理 JSON 对象
  console.log(jsonData);
};

 在浏览器中实现简单加密算法

// 创建一个 ArrayBuffer 对象来存储要加密的数据
var arrayBuffer = new ArrayBuffer(1024);

// 创建一个 Uint8Array 对象来表示要加密的数据
var uint8Array = new Uint8Array(arrayBuffer);

// 将数据复制到 Uint8Array 对象中
uint8Array.set([1, 2, 3, 4, 5]);

// 使用简单的加密算法加密数据
function encrypt(data) {
  for (var i = 0; i < data.length; i++) {
    data[i] = data[i] ^ 123;
  }
}

// 加密数据
encrypt(uint8Array);

// 将加密后的数据转换为 ArrayBuffer 对象
var encryptedArrayBuffer = uint8Array.buffer;

// 创建一个 Uint8Array 对象来表示加密后的数据
var encryptedUint8Array = new Uint8Array(encryptedArrayBuffer);

// 打印加密后的数据
console.log(encryptedUint8Array);

// 使用简单的解密算法解密数据
function decrypt(data) {
  for (var i = 0; i < data.length; i++) {
    data[i] = data[i] ^ 123;
  }
}

// 解密数据
decrypt(encryptedUint8Array);

// 打印解密后的数据
console.log(encryptedUint8Array);

✨ 结语

        ArrayBuffer 和二进制数组是 JavaScript 中用于处理二进制数据的强大工具。它们可以用于存储各种类型的数据,例如图像、音频和视频数据。

高级主题

  • 使用 ArrayBuffer 和二进制数组进行网络通信

ArrayBuffer 和二进制数组可用于在网络上发送和接收二进制数据。这对于传输图像、音频、视频和其他类型的数据非常有用。

  • 使用 ArrayBuffer 和二进制数组进行数据存储

ArrayBuffer 和二进制数组可用于存储各种类型的数据,例如图像、音频、视频和其他类型的数据。

  • 使用 ArrayBuffer 和二进制数组进行低级算法

ArrayBuffer 和二进制数组可用于在浏览器中实现低级算法,例如排序、加密和其他算法。

参考资料

  • JavaScript 教程 - ArrayBuffer 和二进制数组: ArrayBuffer,二进制数组
  • MDN Web Docs - ArrayBuffer: ArrayBuffer - JavaScript | MDN
  • MDN Web Docs - TypedArray: TypedArray - JavaScript | MDN

练习

  • 尝试使用 ArrayBuffer 和二进制数组来存储图像数据。
  • 尝试使用 ArrayBuffer 和二进制数组在网络上发送和接收 JSON 数据。
  • 尝试使用 ArrayBuffer 和二进制数组在浏览器中实现简单加密算法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java学习-常用API-新增时间

1.学习JDK8新增时间的原因&#xff1f; 2.JDK8新增了那些时间&#xff1f; 代替calendar的 localDate localTime localDateTime 常用APi及代码示例&#xff1a; ZoneIdZonedDateTime 常用方法 代码示例&#xff1a; 代替Date的 Instant常见方法及其代码示例&#xff1a; 注…

GEE:CART(Classification and Regression Trees)回归教程(样本点、特征添加、训练、精度、参数优化)

作者:CSDN @ _养乐多_ 对于分类问题,这个输出通常是一个类别标签 ,而对于回归问题,输出通常是一个连续的数值。回归可以应用于多种场景,包括预测土壤PH值、土壤有机碳、土壤水分、碳密度、生物量、气温、海冰厚度、不透水面积百分比、植被覆盖度等。 本文将介绍在Google…

Vue3快速上手(三)Composition组合式API及setup用法

一、Vue2的API风格 Vue2的API风格是Options API,也叫配置式API。一个功能的数据&#xff0c;交互&#xff0c;计算&#xff0c;监听等都是分别配置在data, methods&#xff0c;computed, watch等模块里的。如下&#xff1a; <template><div class"person"…

Imgui(1) | 基于imgui-SFML改进自由落体小球

Imgui(1) | 基于imgui-SFML改进自由落体小球 0. 简介 使用 SFML 做2D图形渲染的同时&#xff0c;还想添加一个按钮之类的 GUI Widget, 需要用 Dear Imgui。由于 Imgui 对于2D图形渲染并没有提供类似 SFML 的 API, 结合它们两个使用是一个比较好的方法, 找到了 imgui-SFML 这个…

阿里云服务器公网带宽收费价格表_2024更新报价

阿里云服务器公网带宽怎么收费&#xff1f;北京地域服务器按固定带宽计费一个月23元/M&#xff0c;按使用流量计费0.8元/GB&#xff0c;云服务器地域不同实际带宽价格也不同&#xff0c;阿里云服务器网aliyunfuwuqi.com分享不同带宽计费模式下带宽收费价格表&#xff1a; 公网…

Android---QUMI实现沉浸式状态栏

沉浸式状态栏是指将 App 的状态栏与应用界面进行融合&#xff0c;使得应用界面能够占据整个屏幕的控件&#xff0c;从而提供更加沉浸式的用户体验。通过使用沉浸式状态栏&#xff0c;应用界面可以延伸到状态栏的区域&#xff0c;使得应用界面的内容更加丰富&#xff0c;同时也能…

【开源】SpringBoot框架开发校园疫情防控管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、系统展示四、核心代码4.1 新增健康情况上报4.2 查询健康咨询4.3 新增离返校申请4.4 查询防疫物资4.5 查询防控宣传数据 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBoot…

web3知识体系汇总

web3.0知识体系 1.行业发展 2. web3的特点&#xff1a; 1、统一身份认证系统 2、数据确权与授权 3、隐私保护与抗审查 4、去中心化运行 Web3.0思维技术思维✖金融思维✖社群思维✖产业思维”&#xff0c;才能从容理解未来Web3.0时代的大趋势。 3.技术栈 Web3.jsSolidit…

【大数据】Flink on Kubernetes 原理剖析

Flink on Kubernetes 原理剖析 1.基本概念2.架构图3.核心概念4.架构5.JobManager6.TaskManager7.交互8.实践8.1 Session Cluster8.2 Job Cluster 9.问题解答 Kubernetes 是 Google 开源的 容器集群管理系统&#xff0c;其提供应用部署、维护、扩展机制等功能&#xff0c;利用 K…

深入理解梯度加权类激活热图(Grad-CAM)

深入理解梯度加权类激活热图&#xff08;Grad-CAM&#xff09; 项目背景与意义 在深度学习领域&#xff0c;模型的预测能力往往是黑盒子&#xff0c;难以解释。梯度加权类激活热图&#xff08;Grad-CAM&#xff09;作为一种可解释性技术&#xff0c;能够帮助模型开发者更好地…

js中事件循环的详解

文章目录 一、是什么二、宏任务与微任务微任务宏任务 三、async与awaitasyncawait 四、流程分析 一、是什么 首先&#xff0c;JavaScript是一门单线程的语言&#xff0c;意味着同一时间内只能做一件事&#xff0c;但是这并不意味着单线程就是阻塞&#xff0c;而实现单线程非阻…

java数据结构与算法刷题-----LeetCode18. 四数之和

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 此题为三数之和的衍生题&#xff0c;代码完全一样&#xff0c;只…

Github 2024-02-13 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-02-13统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量JavaScript项目2Python项目2C项目2TypeScript项目2Rust项目1Go项目1Dart项目1Java项目1C项目1 系统设计指南 …

JavaScript 的点击劫持(Clickjacking)

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 点击劫持是一种恶意攻击&#xff0c;攻击者会在用户不知情的情况下诱…

Stable Diffusion 模型下载:majicMIX sombre 麦橘唯美

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

LeetCode、452. 用最少数量的箭引爆气球【中等,贪心,区间问题】

文章目录 前言LeetCode、452. 用最少数量的箭引爆气球【中等&#xff0c;贪心&#xff0c;区间问题】题目链接与分类思路贪心&#xff0c;连续区间数量问题 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客…

ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions

异常处理模型详解之异常处理概述 一&#xff0c;异常处理相关概念二&#xff0c;异常处理概述 一&#xff0c;异常处理相关概念 在介绍异常处理之前&#xff0c;有必要了解一些关于异常处理状态的术语&#xff1a; 当处理器响应一个异常时&#xff0c;我们称该异常被获取了&a…

python 经典老人言

python 经典老人言 import tkinter as tkclass FlipBook:def __init__(self, master):self.master master master.title("经 典 老 人 言")self.pages ["经 典 老 人 言","求学无笨者&#xff0c;努力就成功","读 书 百 遍&am…

数据结构在JavaScript中的体现

一.概述 数据结构是计算机中存储、组织数据的方式。通常情况下&#xff0c;精心选择的数据结构可以带来最优效率的算法&#xff0c;其实算法并不是一个很高级的东西&#xff0c;它充斥在每一种代码组织方式中&#xff1b;而且各种语言关于数据结构方面的内容都是大同小异的&…

Prompt Tuning:深度解读一种新的微调范式

阅读该博客&#xff0c;您将系统地掌握如下知识点&#xff1a; 什么是预训练语言模型&#xff1f; 什么是prompt&#xff1f;为什么要引入prompt&#xff1f;相比传统fine-tuning有什么优势&#xff1f; 自20年底开始&#xff0c;prompt的发展历程&#xff0c;哪些经典的代表…
最新文章