javascript - 从二进制缓冲区Javascript的一部分创建类型化数组
问题描述
我有一个二进制缓冲区,前半部分包含使用 Uint32 视图作为 int 读取的数据。后半部分旨在使用 Uint8 视图读取为字符。
然而问题是 char 数据的长度不能被 4 整除。
因此,如果 int 数据的长度为 7,char 数据的长度为 5,那么当我制作数组时,我会得到如下响应:
var Unit8Array = new Uint8Array(buffer);
var Unit32Array = new Uint32Array(buffer);
console.log(Unit8Array.length) // 32; (It's 32 because 7*4 + 5 = 32)
console.log(Uint32Array.length) // Error Array Buffer out of bounds
如您所见,我无法创建 Uint32 数组,因为整个缓冲区不能被 Int 的大小整除。但是,我只需要该 Uint32 数组中的前半部分数据。
有没有办法在不创建新缓冲区的情况下解决这个问题?出于性能原因,我希望仅使用不同的视图或分隔缓冲区(意味着多次下载,因为我从 xhr 请求中获取此缓冲区)来读取内存中的相同数据。
我试图这样做:
var uint8Array= new Uint8Array(buffer);
var padding = uint8Array.length + (4 - uint8Array%4);
var uint32Array = new Uint32Array(buffer- padding);
但这只会使 uint32Array 未定义。
解决方案
如果Uint32Array
要从给定数组缓冲区的最大对齐段初始化 a,可以这样做:
var byteLength = buffer.byteLength;
var alignment = Uint32Array.BYTES_PER_ELEMENT;
var alignedLength = byteLength - (byteLength % alignment);
var alignedBuffer = buffer.slice(0, alignedLength);
var uint32Array = new Uint32Array(alignedBuffer);
推荐阅读
- javascript - React + Firebase - 处理非规范化数据
- node.js - 如何让@babel/register 转译 ESM 导入?
- php - 如何将 .HAR/ JSON 文件转换为可读的 .txt 文件?(提取 youtube 实时聊天)
- mysql - 慢查询和proxysql
- javascript - webpack 多项目编译成一个项目
- tizen - 由于“证书链无效,签名中的证书错误”,我无法在 Tizen 模拟器中安装我的应用程序
- api - 在 Angular 通用服务器端使用 jsPDF 创建 PDF
- java - 启动 apache nifi 时出现绑定异常
- laravel - 如何对多个批次使用 then() 回调?
- python - 如何在python中只找到信号的“尖峰”?