js二进制数据及其互相转化实现详解

JS二进制数据及其互相转化实现详解

什么是二进制数据

二进制数据,就是以二进制的形式保存的数据。计算机可以读取和理解二进制数据,因为计算机内部的运作机制就是二进制的。在JS中,可以通过两种方式来处理二进制数据,一种是通过ArrayBuffer对象,另一种是通过TypedArray视图。

ArrayBuffer对象

ArrayBuffer对象是JS中处理二进制数据的基础。它表示一个动态分配的内存区域,可以在这个内存区域中存储任意类型的数据。例如,我们可以创建一个长度为10字节的ArrayBuffer对象:

let buffer = new ArrayBuffer(10);

DataView视图

要操作ArrayBuffer对象中的数据,可以使用DataView视图。DataView视图提供了一系列方法,可以向ArrayBuffer对象中读写数据。

// 以字符串形式创建一个ArrayBuffer对象
let buffer = new ArrayBuffer(10);
// 创建一个DataView视图
let dataView = new DataView(buffer);
// 向DataView视图写入数据
dataView.setInt8(0, 1);
dataView.setInt16(2, 256);
// 从DataView视图读取数据
console.log(dataView.getInt8(0)); // 1
console.log(dataView.getInt16(2)); // 256

TypedArray视图

TypedArray视图是用来处理ArrayBuffer对象中特定类型的数据。JS提供了9种TypedArray视图,包括Int8Array、Uint8Array、Int16Array、Uint16Array、Int32Array、Uint32Array、Float32Array、Float64Array和BigInt64Array。

// 把一个ArrayBuffer对象转化成TypedArray视图
let buffer = new ArrayBuffer(10);
let int8Array = new Int8Array(buffer);
let uint32Array = new Uint32Array(buffer);
// 向TypedArray视图写入数据
int8Array.set([1, 2, 3]);
uint32Array[1] = 256;
// 从TypedArray视图读取数据
console.log(int8Array[0]); // 1
console.log(uint32Array[1]); // 256

二进制数据和其他数据类型的相互转化

字符串和二进制数据的相互转化

字符串可以通过TextEncoder和TextDecoder对象和二进制数据相互转化。TextEncoder对象可以把字符串转化成二进制数据,TextDecoder对象可以把二进制数据转化成字符串。

let text = 'hello world';
let encoder = new TextEncoder();
let decoder = new TextDecoder();
let binaryData = encoder.encode(text);
let textData = decoder.decode(binaryData);
console.log(binaryData);
console.log(textData);

数组和二进制数据的相互转化

在TypedArray视图中,提供了两个方法buffer和from,可以用来把TypedArray视图和ArrayBuffer对象相互转化。

let int8Array = new Int8Array([1,2,3]);
let buffer = int8Array.buffer;
let array = Array.from(int8Array);
let newInt8Array = new Int8Array(buffer);
console.log(buffer);
console.log(array);
console.log(newInt8Array);

示例

示例1:使用AES算法加密二进制数据和解密二进制数据

const key = 'abcdefghijklmnop'.split('').map(c => c.charCodeAt(0));
const iv = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
//加密
function encryptAES(password, iv, data) {
  const cipher = new AES(key, iv);
  return cipher.encrypt(data);
}
//解密
function decryptAES(password, iv, data) {
  const cipher = new AES(key, iv);
  return cipher.decrypt(data);
}
const data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
const encryptedData = encryptAES(key, iv, data);
console.log(encryptedData);
const decryptedData = decryptAES(key, iv, encryptedData);
console.log(decryptedData);

示例2:使用Base64编码和解码二进制数据

const text = 'hello, world!';
const encoder = new TextEncoder();
const decoder = new TextDecoder();
const binaryData = encoder.encode(text);
const base64Data = btoa(String.fromCharCode.apply(null, binaryData));
const decodedBinaryData = new Uint8Array(Array.prototype.map.call(atob(base64Data), c => c.charCodeAt(0)));
const decodedText = decoder.decode(decodedBinaryData);
console.log(base64Data);
console.log(decodedBinaryData);
console.log(decodedText);

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js二进制数据及其互相转化实现详解 - Python技术站

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

相关文章

  • JS内部事件机制之单线程原理

    JS内部事件机制是指JavaScript在运行时的一种消息传递机制。其基本原理是采用单线程模型,即所有的任务都在同一个线程中执行,并且采用事件循环的机制来管理和调度任务。以下是JS内部事件机制之单线程原理的完整攻略: 什么是JS内部事件机制? JS内部事件机制是指JavaScript运行时的一种机制,用于管理和调度任务,其原理是采用单线程模型,即所有的任务都…

    JavaScript 2023年6月11日
    00
  • 常见的JS字符串属性与方法集锦

    让我们来详细讲解一下JS字符串属性与方法的常见用法。 字符串的属性 字符串是一个基本的数据类型,在JavaScript中,字符串属性和方法是相当的丰富。我们来看看一些常见的字符串属性: length 字符串的 length 属性是一个在字符串中含有的字符数,比如: const str = "hello world"; console.lo…

    JavaScript 2023年5月19日
    00
  • JavaScript闭包原理与使用介绍

    JavaScript闭包原理与使用介绍 什么是闭包(Closure) 在 JavaScript 中,闭包(Closure)是指被包含在函数中的一个函数和其对外部变量的引用组合。 通俗地说,当一个函数访问其外部作用域中的变量时,就创建了一个闭包。 闭包的原理 在 JavaScript 中,每当创建一个函数时,都会为该函数创建一个作用域链(Scope Chain…

    JavaScript 2023年6月10日
    00
  • Js参数值中含有单引号或双引号问题的解决方法

    Js参数值中含有单引号或双引号问题的解决方法可以通过转义字符进行转义。以下是详细的攻略: 方法一:使用转义字符 在引号前加上反斜杠(\)作为转义字符即可解决问题。如果参数值中含有单引号,则用反斜杠转义单引号(\’),如果参数值中含有双引号,则用反斜杠转义双引号(\”)。 例如: let name1 = "Tom’s cat"; // 包含…

    JavaScript 2023年6月11日
    00
  • JavaScript之IE的fireEvent方法详细解析

    JavaScript之IE的fireEvent方法详细解析 什么是fireEvent方法 fireEvent是IE浏览器的一个方法,用于模拟触发特定的事件。它接收一个参数——事件名字,然后触发该事件,从而可以调用相应的事件处理程序。fireEvent方法可以在使用原生JavaScript开发IE浏览器应用程序和Web页面时非常有用,因为它可以允许您编写通用的…

    JavaScript 2023年6月10日
    00
  • JS实现进度条顺滑版详细方案

    下面是JS实现进度条顺滑版详细方案。 方案概述 实现进度条顺滑版的方案,需要用到JS的定时器和CSS3的过渡效果,大致的流程如下: 获取进度条元素和进度值。 设置定时器,每隔一定时间(比如100毫秒)更新进度条的宽度,直到达到目标进度值。 在每次更新进度条的宽度时,为其添加过渡效果(transition),实现顺滑的动画效果。 具体实现 示例1:使用setT…

    JavaScript 2023年6月11日
    00
  • DOM节点深度克隆函数cloneNode()用法实例

    DOM节点深度克隆函数cloneNode()是一个非常常用的方法,可用于将当前节点的所有子孙节点以及属性克隆到新节点中。本文将详细介绍cloneNode()的用法,包括如何使用该方法创建克隆节点、如何克隆节点的所有子元素以及如何实现深拷贝等。 克隆节点 首先我们来看如何使用cloneNode()方法创建克隆节点。cloneNode()方法可以接收一个参数,表…

    JavaScript 2023年6月10日
    00
  • javascript调试之DOM断点调试法使用技巧分享

    JavaScript调试之DOM断点调试法使用技巧分享 什么是DOM断点调试法 DOM断点调试法是一种网页调试方法,主要利用断点调试DOM元素的方式,来定位和解决JavaScript的问题。当页面效果不符合预期,或者页面崩溃、卡死等情况出现时,可以使用DOM断点调试法,找到问题所在,快速解决问题。 如何使用DOM断点调试法 步骤一:定位问题 首先,根据报错信…

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