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

从二进制缓冲区Javascript的一部分创建类型化数组,javascript,arrays,performance,typed-arrays,Javascript,Arrays,Performance,Typed Arrays,我有一个二进制缓冲区,前半部分包含使用Uint32视图作为int读取的数据。第二部分是使用Uint8视图作为字符读取的 然而,问题是字符数据的长度永远不能保证被4整除 如果int数据的长度是7,char数据的长度是5,那么当我制作数组时,我得到如下响应: var Unit8Array = new Uint8Array(buffer); var Unit32Array = new Uint32Array(buffer); console.log(Unit8Array.length) // 3

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

然而,问题是字符数据的长度永远不能保证被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);

但这只会使uint32数组未定义。

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

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

您不需要构造
uint8Array
来获取缓冲区长度,您可以直接访问
buffer.bytellength
。另外,我不确定使用
uint8Array
作为
%
的操作数和
buffer
作为
-
@PatrickRoberts的操作数时会发生什么,获取缓冲区的长度不是问题。问题是长度不能被4整除,因此不能从中生成int数组。我希望对padding变量所做的是计算数组需要截断多少才能被4整除。然后我试着用“缓冲区填充”从缓冲区中切掉那个量,但没有用。是的,我明白你想要完成什么。我是说你似乎忘记了缓冲区是一个对象而不是一个数字。您不能从
缓冲区
中减去
填充
,也不能将数字传递给
Uint32Array()
构造函数以引用任何特定缓冲区对其进行初始化。@PatrickRoberts是的,我知道您不能从对象中减去数字,但我想将其作为我尝试过的东西发布。那么,有没有办法从这个缓冲区构建一个int数组呢?希望我的答案对你有用。如果您感兴趣,我还发布了一个npm模块,该模块用于处理结构化数据,类似于C结构和联合。您可能会发现它对于封装试图用JavaScript表示的数据结构很有用。