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

节省

我有一个二进制缓冲区,前半部分包含使用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未定义。

帕特里克·罗伯茨

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

重写二进制文件的一部分

如何在Python中复制二进制文件的一部分?

如何转储二进制文件的一部分

如何使用 C++ 覆盖二进制文件的一部分?

在方法签名中匹配二进制的一部分

在C ++中仅复制二进制文件的一部分

在Java 7中删除二进制文件的一部分的最佳方法是什么

有效地替换二进制对象的一部分

使用gnu-coreutils,bash获取二进制文件的一部分

这个websocket结果的哪一部分是二进制protobuf数据?

如何在不复制的情况下删除二进制文件的一部分

使用Python的open()函数读取二进制文件时,只读取文件的一部分

OpenCL NDRange用法-内核仅更改输出缓冲区的一部分

获取recv()缓冲区的一部分

如何在提琴手中拦截多部分/表单数据并访问作为请求一部分的二进制文件

Vulkan 计算着色器仅读取统一缓冲区的一部分

无法在Elixir中使用二进制运算符提取字符串的一部分

C++ 如何将二进制文件的一部分复制到新文件中?

将二进制文件的一部分读取到预先存在的basic_string对象中

为什么返回“ -1”;是不是在可汗学院的“二进制搜索算法挑战赛”中成为条件语句的一部分?

作为 WSARecvFrom 调用的一部分,如何将缓冲区放入 CompletionROUTINE?

NodeJS读取二进制浮点缓冲区

C ++获取缓冲区的二进制值

将二进制数据写入缓冲区

Python中的二进制缓冲区

Numpy 连接空二进制缓冲区

二进制字符数组到 stringstream 并从缓冲区弹出

从二进制缓冲区初始化变量的正确方法是什么?

Cython是否将导入的模块作为二进制文件的一部分进行编译?