首页 > 其他分享 >ArrayBuffer和Blob解析

ArrayBuffer和Blob解析

时间:2023-12-01 22:32:44浏览次数:47  
标签:setUint8 DataView const 16 ArrayBuffer dataView Blob 解析 byteOffset

API介绍

1、ArrayBuffer:用来表示通用的、固定长度的原始二进制数据缓冲区。它不能直接读写,只能通过视图(TypedArray 视图和 DataView 视图)来读写,视图的作用是以指定格式解读二进制数据。

2、TypedArray:一个 TypedArray 对象描述了底层二进制数据缓冲区的类数组视图

3、DataView :DataView 视图是一个可以从二进制 ArrayBuffer 对象中读写多种数值类型的底层接口,使用它时,不用考虑不同平台的字节序(endianness)问题。

4、getUint8() 方法从 DataView相对于起始位置偏移 n 个字节处开始,获取一个无符号的 8-bit 整数 (一个字节)

5、getUint16() 方法从 DataView 相对于起始位置偏移 n 个字节处开始,获取一个 16-bit 数 (无符号短整型,2 个字节)

6、getUint32() 方法从 DataView 相对于起始位置偏移 n 个字节处开始,获取一个 32-bit 数 (无符号长整型,4 个字节)

7、setInt8() 从 DataView 起始位置以 byte 为计数的指定偏移量 (byteOffset) 处储存一个 8-bit 数 (一个字节)

8、setUint16() 从 DataView 起始位置以 byte 为计数的指定偏移量 (byteOffset) 处储存一个 16-bit 数 (无符号短整型)

9、setUint32() 从 DataView 起始位置以 byte 为计数的指定偏移量 (byteOffset) 处储存一个 32-bit 数 (无符号长整型)

10、Blob :对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。

项目使用场景示例

开发小程序蓝牙传输项目中,接收数据和发送数据的处理。

1、10进制转16进制转二进制数据处理

2、解析二进制数据流为16进制/10进制

 1、$command_tobuffer,  // 将字符转化为buffer

/** 
 * 命令帧
 * @typedef {object} json
 * @property {Hex} head
 * @property {Hex} end
 * @property {Number} length
 * @property {Hex} command
 * @property {String|Number} code
 * @returns ArrayBuffer
 */
function  $command_tobuffer({ head = 0x55, end = 0x16, length, command, body, type='default' }) {
  const byteOffset = 3; // 帧头 + 帧长度 + 命令
  const buffer = new ArrayBuffer(byteOffset + length + 1); //  byteOffset - 1 + length + 校验值 + 帧尾
  const dataView = new DataView(buffer);
 
  dataView.setUint8(0, head); // 帧头
  dataView.setUint8(1, '0x' + length.toString(16)); // 帧长
 
  dataView.setUint8(2, command); // 命令字
 
  // 主体信息
  if(type==='default'){
    string2HexFromDataView({
      dataView,
      string: body,
      byteOffset
    });
  } else {
    number2HexForDataView({
      dataView,
      number: body,
      byteOffset
    });
  }
 
 
  const checkCodeIdx = length + 2;
  const sign = checkSum(dataView, 2, checkCodeIdx);
  // console.log('sum', sign);
  dataView.setUint8(checkCodeIdx, '0x' + sign); // 检验码
 
  dataView.setUint8(checkCodeIdx + 1, end); // 帧尾
  return {buffer, checkSum:sign};
}
 
/** 
 * 字符串转16进制
 * @typedef {object} json
 * @property {DataView} dataView
 * @property {String} string
 * @property {Number} byteOffset
 */
function string2HexFromDataView({ dataView, string, byteOffset = 0 }) {
    for (let i = 0; i < string.length; i++) {
      const idx = i + byteOffset;
        // console.log(string[i].charCodeAt(0).toString(16))
      dataView.setUint8(idx, '0x' + string[i].charCodeAt(0).toString(16))
    }
}
 
/** 
 * 数值(10进制)转16进制buffer  为了容 时间戳
 */
function number2HexForDataView({ dataView, number, byteOffset = 0 }) {
  const hex = number.toString(16);
  for (let i = 0; i < hex.length; i+=2) {
    const idx = i / 2 + byteOffset;
    dataView.setUint8(idx, '0x' + hex.substr(i, 2))
  }
}
/**
 * 检验和
 * @param {DataView} dataView 
 * @param {Number} start 
 * @param {Number} end 
 * @returns Hex
 */
function checkSum(dataView, start, end) {
  let sum = 0;
  for (let i = start; i <= end; i++) {
    const view = dataView.getUint8(i);
    
    sum += view;
  }
  // console.log('ss', sum)
  // return (('0x' + sum.toString(16)) & 0xFF).toString(16); // 与运算取8位
  const resHex = (('0x' + sum.toString(16)) & 0xFF).toString(16);
  return resHex.length === 1? 0+''+ resHex: resHex;
}

一个完整的传输帧包括如:帧头+帧长度+帧命令+帧内容+和校验+帧尾;

例如 dataView.setUint8(0, head) :dataView视图设置0的位置是由16进制标识0x开头的4位字符。以此类推最终拼接成一个完整的ArrayBuffer通过蓝牙传输出去。

标签:setUint8,DataView,const,16,ArrayBuffer,dataView,Blob,解析,byteOffset
From: https://blog.51cto.com/u_16377360/8649396

相关文章

  • 案例解析关于ArkUI框架中ForEach的潜在陷阱与性能优化
    本文分享自华为云社区《深入解析ForEach的潜在陷阱与性能优化:错误用法与性能下降的案例分析》,作者:柠檬味拥抱。在ArkUI框架中,ForEach接口是基于数组类型数据进行循环渲染的强大工具。它需要与容器组件搭配使用,并能够根据数据源动态生成相应的子组件。以下是对ForEach接口的详细......
  • 通过Span实现高性能数组,实例解析
    Span<T>是C#7.2引入的一个强大的数据结构,用于表示内存中的一块连续数据。它可以用于实现高性能的数组操作,而无需额外的内存分配。在本文中,我将详细介绍如何使用Span<T>来实现高性能数组操作,并提供一些示例代码来说明其用法。什么是Span?Span<T>是System.Memory命名空间......
  • 网络 主机名 地址 解析
    针对问题,查找整理记录情景电脑没加入域电脑在域网络中电脑使用SMB协议访问域网络中加入域的其他电脑电脑使用HTTP协议访问域网络中需账号登录的网站主机名(Hostname)到IP地址的解析方式:本地DNS解析向其他计算机广播NetBIOS请求(NetworkBasicInput/OutputSystem)解析。......
  • 预约系统源码解析:打造智能定制化预约服务的技术奇迹
    在当今数字化时代,预约系统的重要性日益凸显,而预约系统源码的开放将为各行业带来更加灵活、智能的预约解决方案。本文将深入探讨预约系统源码的技术内幕,为开发者提供实用的代码示例,助力打造智能定制化的预约服务。技术栈概览预约系统源码采用了现代化的技术栈,其中包括前端使用React......
  • 构建智能预约体验:深度解析预约系统源码的代码精髓
    随着数字化时代的发展,预约系统在各行业中扮演着越来越重要的角色。本文将深入研究预约系统源码,通过代码示例分析其技术要点,为开发者提供实用的指导,助力构建智能、高效的预约体验。技术栈综述预约系统源码采用了现代化的技术栈,主要包括前端使用React框架,后端采用Node.js和Express框......
  • TSINGSEE青犀AI视频智能分析系统的视频接入能力解析
    视频智能分析技术是一种先进的人工智能技术,它能够对视频内容进行自动化的分析和理解。这种技术的主要特点包括实时性、自动化、准确性、可解释性等。1)实时性。视频智能分析技术能够在短时间内对大量的视频数据进行快速处理和分析,从而提供实时的反馈和决策支持。这种技术可以应用于......
  • Linux 内核参数调整解析:深度优化数据库性能 转载:https://www.toutiao.com/article/73
    系统内核参数配置文件:/etc/sysctl.conf一、参数说明1、关闭IPv6支持net.ipv6.conf.all.disable_ipv6=1net.ipv6.conf.default.disable_ipv6=1作用:关闭对IPv6的支持,减轻系统负担,提高安全性。解析:net.ipv6.conf.all.disable_ipv6:禁用系统中所有网络接口的IPv6。net......
  • 深入解析C# List<T>的源码
    前面的文章中解释了Array的初始化和元素插入,以及数组整体的存储结构(《深度分析C#中Array的存储结构》)。这里我们再来详细的了解另一种存储结构List<T>, List<T>是ArrayList 泛型版本,是一个泛型集合类,用于表示动态大小的数组。List<T>应该是我们在开发过程中使用的频率最......
  • 数据可视化软件之变:免费化趋势解析
    近年来,我们见证了数据可视化软件呈现出明显的免费化趋势。这个趋势的背后隐藏着许多关键原因,影响着整个数据行业的发展和走向。为何数据可视化软件开始朝着免费方向发展?让我们一同深入探讨。普及数字化需求:数字化已经深入到我们日常生活和工作的方方面面。随着大数据和信息化的......
  • 回归算法全解析!一文读懂机器学习中的回归模型
    本文全面深入地探讨了机器学习中的回归问题,从基础概念和常用算法,到评估指标、算法选择,以及面对的挑战与解决方案。文章提供了丰富的技术细节和实用指导,旨在帮助读者更有效地理解和应用回归模型。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、......