首页 > 解决方案 > 从二进制缓冲区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 未定义。

标签: javascriptarraysperformancetyped-arrays

解决方案


如果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);

推荐阅读