js操作二进制数据

news2024/11/19 23:36:17

使用ArrayBuffer对象保存二进制数据,使用TypedArray和DataView 视图来读写数据。

ArrayBuffer代码内存中的一段数据

const buff = new ArrayBuffer(4)

这样就创建了一个4(byte)字节的长度的内存判断,初始值都为0

注:一般中文占2个字节,英文占1个字节。不同的编码会不同比如:中文在UTF-8占3个字节、在UTF-16中占4个字节

ArrayBuffer属性和方法

一个属性:byteLength,获取他里面数据的字节数和

buff.byteLength
// 4

一个方法:slice,和数组slice一个用于拷贝一段内存

buff.slice(1,3)
// ArrayBuffer(2)
// 拷贝了 buff 里下标 1、2 的内存数据

ArrayBuffer不能直接读写,只是放数据的容器,不能直接对内存数据进行读写,因为操作二进制数据可以有多种不同的数据类型、他们字节长度、值范围都不相同,不指定类型,不能读写内存数据

如:

 Uint8是8位不带符号整数,值范围是 0 到 255 ,长度为1Byte

 而 Int32 是有符号整数,值范围是 -2,147,483,648 到 +2,147,483,647,长度为 4 Byte。

ArrayBuffer 支持使用以下 9 种类型来读写内存数据:

  • Int8 8位带符号整数 signed char
  • Uint8 8位不带符号整数 unsigned char
  • Uint8C 8位不带符号整数(自动过滤溢出) unsigned char
  • Int16 16位带符号整数 short
  • Uint16 16位不带符号整数 unsigned short
  • Int32 32位带符号整数 int
  • Uint32 32位不带符号的整数 unsigned int
  • Float32 32位浮点数 float
  • Float64 64位浮点数 double

TypedArray

TypedArray 可以将一段 ArrayBuffer 的数据全部使用我们设定的类型来操作。

创建 TypedArray

TypedArray 可以使用 9 种类型,每个类型有对应的构造函数:

  • Int8Array:8位有符号整数,长度1个字节。
  • Uint8Array:8位无符号整数,长度1个字节。
  • Uint8ClampedArray:8位无符号整数,长度1个字节,溢出处理不同。
  • Int16Array:16位有符号整数,长度2个字节。
  • Uint16Array:16位无符号整数,长度2个字节。
  • Int32Array:32位有符号整数,长度4个字节。
  • Uint32Array:32位无符号整数,长度4个字节。
  • Float32Array:32位浮点数,长度4个字节。
  • Float64Array:64位浮点数,长度8个字节。

构造函数接收一个 ArrayBuffer 对象,将其转换成指定类型的二进制数组。

new (array: ArrayBufferLike | ArrayLike<number>, byteOffset?: number | undefined, byteLength?: number | undefined) => TypedArray

同一个 ArrayBuffer 可以生成多个不同类型的 TypedArray

const buff = new ArrayBuffer(4)
// 申请了长度为 4 字节的内存

const uInt8 = new Uint8Array(buff)
// 创建了长度为 4 的数组 (因为 Uint8 的单位长度是 1 字节)

const int32 = new Int32Array(buff)
// 创建了长度为 1 的数组(因为 Int32Array 的单位长度是 4 字节)

// 如果有需要,也可以设定起始位置的偏移量,以及从起始位置开始的内存长度
const uInt8 = new Uint8Array(buff, 1, 2)

操作 TypedArray

TypedArray 是类数组对象,我们可以使用数组的方式来操作,如:

// 读
uInt8[0]

// 写
uInt8[0] = 1

// 数组方法
uInt8.findIndex(val=>val===0)

注意:

使用 ArrayBuffer 数据创建 TypedArray 时,生成的 TypedArray 对象数组只是对 ArrayBuffer 的引用。

TypedArray 的属性

  • buffer:保存着这个 TypedArray 操作的 ArrayBuffer 对象。所以从 TypedArray 对象里返回其数据时,要使用它的 buffer 属性。
  • byteOffset:起始位置的偏移量
  • byteLength:字节长度,也就是内存使用量。
  • length:数组长度,根据类型不同,数组长度也不同。

例如 4 字节的 byteLength,以 Uint8Array 读取则 length 为 4,以 Int32Array 读取则 length 为 1。

DataView

DataView 和 TypedArray 的区别

DataView 和 TypedArray 有一些区别:

  • TypedArray 把整个 ArrayBuffer 全部视为某种指定的类型,而 DataView每次操作都必须手动指明类型,所以它可以灵活使用多种类型。
  • TypedArray 是类数组对象,但 DataView 不是类数组对象,所以不能使用数组的方法。
  • TypedArray 不能设定字节序(总是小端),而 DataView 可以设定字节序(大端或小端)(默认小端)。

创建 DataView

使用 DataView 构造函数来创建一个 DataView 对象。

语法:

new (buffer: ArrayBufferLike, byteOffset?: number | undefined, byteLength?: number | undefined) => DataView

简单示例:

const view = new DataView(buff)

// 如果有需要,也可以设定起始位置的偏移量,以及从起始位置开始的内存长度
const view = new DataView(buff, 2, 2)

由于创建 DataView 对象时不能指定类型,所以我们在操作时必须手动指定类型。

DataView 只有对内存的读、写操作,而且要使用指定的方法。它不能像 TypedArray 那样使用数组下标和数组方法。

DataView 读内存

DataView 实例提供 8 个方法读取内存。

  • getInt8 读取 1 个字节,返回一个 8 位整数。
  • getUint8 读取 1 个字节,返回一个无符号的 8 位整数。
  • getInt16 读取 2 个字节,返回一个 16 位整数。
  • getUint16 读取 2 个字节,返回一个无符号的 16 位整数。
  • getInt32 读取 4 个字节,返回一个 32 位整数。
  • getUint32 读取 4 个字节,返回一个无符号的 32 位整数。
  • getFloat32 读取 4 个字节,返回一个 32 位浮点数。
  • getFloat64 读取 8 个字节,返回一个 64 位浮点数。
const view = new DataView(buff)

view.getUint8(0)

view.getUint16(1)
// DataView.getUint16(byteOffset: number, littleEndian?: boolean | undefined): number

// 使用大端字节序
view.getUint32(2, false)

第一个参数是读取的内存的位置;

第二个参数是可选参数,用来指定字节序。只有当一次性读取超过 1 字节时才有这个参数。

DataView 默认使用小端字节序。如果你要使用大端字节序,必须把第二个参数设置为 false

DataView 写内存

DataView 写内存的方法也是 8 个,与读内存的 8 个方法对应。

  • setInt8 写入 1 个字节的 8 位整数。
  • setUint8 写入 1 个字节的 8 位无符号整数。
  • setInt16 写入 2 个字节的 16 位整数。
  • setUint16 写入 2 个字节的 16 位无符号整数。
  • setInt32 写入 4 个字节的 32 位整数。
  • setUint32 写入 4 个字节的 32 位无符号整数。
  • setFloat32 写入 4 个字节的 32 位浮点数。
  • setFloat64 写入 8 个字节的 64 位浮点数。
const view = new DataView(buff)

// DataView.setInt8(byteOffset: number, value: number): void
view.setInt8(0, 0xbb)

// DataView.setInt16(byteOffset: number, value: number, littleEndian?: boolean | undefined): void
view.setInt16(4, 1, true)

view.setInt32(8, 520, true)

DataView 的属性

  • buffer:保存着这个 DataView 操作的 ArrayBuffer 对象。所以从 DataView 对象里返回其数据时,要使用它的 buffer 属性。
  • byteOffset:起始位置的偏移量
  • byteLength:字节长度,也就是内存使用量。

DataView 不是类数组对象,所以没有 length 属性。

一些应用方法:

// ArrayBuffer转16进度字符串示例
ab2hex(buffer) {
    const hexArr = Array.prototype.map.call(
        new Uint8Array(buffer),
        function(bit) {
            return ('00' + bit.toString(16)).slice(-2)
        }
    )
    return hexArr.join('')
},
// 16进制字符串转ArrayBuffer
hex2ArrayBuffer(hex_str) {
    let typedArray = new Uint8Array(hex_str.match(/[\da-f]{2}/gi).map(function(h) {
        return parseInt(h, 16)
    }))
    let buffer = typedArray.buffer
    return buffer
},

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

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

相关文章

葡聚糖修饰Hrps共价三聚肽|葡聚糖修饰CdSe量子点

葡聚糖修饰Hrps共价三聚肽|葡聚糖修饰CdSe量子点 葡聚糖修饰Hrps共价三聚肽 中文名称&#xff1a;葡聚糖修饰Hrps共价三聚肽 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体 包装&#xff1a;瓶装/袋装 溶解性&am…

爆火的 ChatGPT 会让客服岗位消失吗?

近日&#xff0c;由 OpenAI 推出的 ChatGPT 在全球互联网爆火。具体有多火呢&#xff1f;根据 OpenAI 的 CEO Sam Altman 的说法&#xff1a;上周三才上线的 ChatGPT&#xff0c;短短几天&#xff0c;用户数已突破 100 万大关。 那么&#xff0c;ChatGPT 是什么呢&#xff1f;…

无线充电智能车的制作

本文素材来源于宁夏大学 作者&#xff1a;白二曹、王瑞、穆琴、王童兵 指导老师&#xff1a;康彩 一、项目简介 1.功能介绍 无线充电智能车由无线充电、自动控制、红外遥控、网页显示四部分组成。 &#xff08;1&#xff09;流程描述 用户端浏览器访问http://127.0.0.1页面…

Cy5.5 Tyramide,Cyanine5.5 Tyramide,花青素Cy5.5 酪酰胺化学试剂供应

一&#xff1a;产品描述 1、名称 英文&#xff1a;Cy5.5 Tyramide&#xff0c;Cyanine5.5 Tyramide 中文&#xff1a;花青素Cy5.5 酪酰胺 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Cyanine 4、分子量&#xff1a;738.4 5、分子式&#xff1a;C48H52CIN3O2 6、…

如何用DOS命令设置ip地址及DNS

用DOS命令设置ip地址及DNS 设置/修改IP地址&#xff0c;子网掩码&#xff0c;网关的格式&#xff1a; netsh interface ip set address "本地连接" static 10.25.35.35 255.255.255.0 10.25.35.7 auto[more] 命令的意思是将“本地连接” ip地址设置成 10.25.35.3…

SD NAND 的 SDIO在STM32上的应用详解(下篇)

七.SDIO外设结构体 其实前面关于SDIO寄存器的讲解已经比较详细了&#xff0c;这里再借助于关于SDIO结构体再进行总结一遍。 标准库函数对 SDIO 外设建立了三个初始化结构体&#xff0c;分别为 SDIO 初始化结构体SDIO_InitTypeDef、SDIO 命令初始化结构体 SDIO_CmdInitTypeDef…

Lq93:复原 IP 地址

有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&#xff0c;但是 "0.011.255.2…

Java基础:Map集合

1. Map集合概述 现实生活中&#xff0c;我们常会看到这样的一种集合&#xff1a;IP地址与主机名&#xff0c;身份证号与个人&#xff0c;系统用户名与系统用户对象等&#xff0c;这种一一对应的关系&#xff0c;就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象…

IOC 容器

IOC 概念和原理 1. 什么是 IOC&#xff1f; 控制饭庄&#xff08; Inversion of Control &#xff0c;缩写为 IOC&#xff09;&#xff0c;是面向对象编程中的一种设计原则&#xff0c;可以用来降低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入&#xff08; Depende…

基于SSM的网红书购物商城(源码+论文+开题报告+答辩PPT)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

java实现简单窗口小游戏“扫雷”

前言 忘记是从何处看到过关于扫雷小程序的文章&#xff0c;所以这次也就跟着做一下。其实很简单的&#xff0c;如果有java入门的同学也可以尝试一下自己做这种java小程序。几行代码做几遍基本上能摸清楚这些基础了&#xff0c;对于编程能力也能提高一些。&#xff08;虽然小编…

appium笔记——01环境搭建

0、关系图 1.appium客户端&#xff1a; python程序&#xff0c;链接appium服务器&#xff0c;并发送请求 2.appium服务端(模拟器客户端)&#xff1a; appium程序&#xff0c;需要提前启动&#xff0c;不仅充当appium服务端&#xff0c;还充当模拟器客户端&#xff08;接收h…

基于Apriori算法的购物网站商品推荐系统

基于Apriori算法的购物网站商品推荐系统 目 录 一、 算法内容 3 Step 1 收集用户偏好 3 Step 2 对数据进行预处理 3 Step 3 计算相似度 4 Step 4 找邻居 5 Step 5 计算推荐 6 二、 预期结果 6 三、 对比和讨论 7 Step 5 计算推荐 Section A 基于用户的协同过滤(User CF) 通过前…

Python中12个常用模块的使用教程

1. time模块 import time *一*#时间戳--》结构化时间--》格式化的字符串时间 ----------------------------------------------------------------------------- res1time.localtime(654126574) print(res1 ) #res1time.struct_time(tm_year1990, tm_mon9, tm_mday24, tm_hour…

数学大世界杂志数学大世界杂志社数学大世界编辑部2022年第7期目录

名家论坛《数学大世界》投稿&#xff1a;cn7kantougao163.com 新时期高中数学课堂教学有效性的提升策略 姜徳余; 3-5 化“零”为整&#xff0c;以“构”促学——小学数学结构化教学策略探析 孟龙平; 6-8 做反思型教师&#xff0c;加强数学衔接模块教学 陈小菊; 9-1…

[附源码]Python计算机毕业设计SSM基于远程协作的汽车故障诊断系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

SELinux

文章目录SELinux说明SELinux 的运行模式SElinux命令SELinux 是 Security-Enhanced Linux 缩写&#xff0c;安全强化的linux 系统资源都是通过程序进行访问的&#xff0c;如果将/var/www/html权限设置为777&#xff0c;代表所有程序均可以对该目录访问&#xff0c;如果已启动www…

面试官狂问八股文?我已经被三家公司问到哑口无言……

秋招刚过去&#xff0c;整体的感受是&#xff1a;面试难度和拿 offer 的难度比往年难多了&#xff0c;而且互联网还有较大的裁员风险&#xff0c;网上各种消息不断&#xff0c;有时候真是焦虑到不行。 大家还是要早做准备&#xff0c;多面试积累经验&#xff0c;有些人总想准备…

WebDAV之葫芦儿·派盘+可乐记

可乐记 支持WebDAV方式连接葫芦儿派盘。 推荐一款小巧好用的便签类记事本软件,它能够帮助用户在手机上快捷的记录一些代办事项或者是当做一个日记本来记录心情,小容量设备的福音,它就是可乐记。 可乐记这款软件的界面非常的简单,用户在首页就能看到最近所创建的标签,用…

服务器远程端口怎么修改

服务器远程端口怎么修改 修改Windows系统实例默认远程端口 以Windows Server 2012为例介绍如何修改Windows系统实例默认远程端口。 远程连接进入服务器后修改注册表子项PortNumber的值。 按快捷键 Win&#xff08;Windows 徽标键&#xff09;R&#xff0c;启动运行窗口。输…