从二进制缓冲区Javascript的一部分创建类型化数组

时间:2018-07-12 21:32:06

标签: javascript arrays performance typed-arrays

我有一个二进制缓冲区,前半部分包含要使用Uint32视图读取为int的数据。下半部分将使用Uint8视图作为char读取。

但是问题是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未定义。

1 个答案:

答案 0 :(得分:2)

如果要从给定数组缓冲区的最大对齐段中初始化Uint32Array,则可以执行以下操作:

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