【问题标题】:How do you decide which typed array to use?你如何决定使用哪个类型的数组?
【发布时间】:2016-10-23 04:07:18
【问题描述】:

我正在尝试创建 ArrayBuffer 对象的视图以便对其进行 JSON 化。

var data = { data: new Uint8Array(arrayBuffer) }
var json = JSON.stringify(data)

似乎ArrayBuffer 的大小即使是最小的Uint8Array 也无关紧要。到目前为止我没有收到任何 RangeError :) 如果是,我如何决定使用哪个类型化数组?

【问题讨论】:

  • 您根据存储在缓冲区中的数据做出决定,或者更确切地说,根据您对该数据的解释来决定。
  • 另外,anUint8Array 不是一个 8 位数组,它是一个无符号 8 位整数数组。它可以有任何长度。从与Uint16Array 相同的ArrayBuffer 创建的Uint8Array 的长度将是Uint16Array 的两倍,因为ArrayBuffer 中的每个字节都将作为Uint8Array 的一个元素“放置”,而对于Uint16Array 每对字节都将“成为”数组中的一个元素。
  • @SergiuParaschiv 您应该将其发布为答案。你解释得很好。
  • @SergiuParaschiv 感谢您的评论。我现在明白差异与数据格式有关。何时将 Uint16Array 用于 Uint8Array?可以举个例子让我理解吗?
  • 我现在正在寻找更完整的答案:)

标签: javascript json arraybuffer typed-arrays


【解决方案1】:

您根据存储在缓冲区中的数据做出决定,或者更好地说,根据您对该数据的解释。

另外,Uint8Array 不是 8 位数组,它是一个无符号 8 位整数数组。它可以有任何长度。从与Uint16Array 相同的ArrayBuffer 创建的Uint8Array 的长度将是ArrayBuffer 的两倍,因为ArrayBuffer 中的每个字节都将作为Uint8Array 的一个元素“放置”,而对于Uint16Array 每对字节将“成为”数组中的一个元素。

如果我们尝试以二进制方式思考会发生什么,一个很好的解释是。尝试运行:

var buffer = new ArrayBuffer(2);
var uint8View = new Uint8Array(buffer);
var uint16View = new Uint16Array(buffer);

uint8View[0] = 2;
uint8View[1] = 1;

console.log(uint8View[0].toString(2));
console.log(uint8View[1].toString(2));
console.log(uint16View[0].toString(2));

输出将是

10
1
100000010

因为在二进制中显示为无符号 8 位整数,所以 2 是 00000010,1 是 00000001。(toString 去除前导零)。

Uint8Array 表示一个字节数组。正如我所说,一个元素是一个无符号的 8 位整数。我们只是向它推送了两个字节。

在内存中,这两个字节并排存储为 00000001 00000010(二进制形式再次用于使事情更清晰)。

现在,当您在同一个缓冲区上初始化 Uint16Array 时,它将包含相同的字节,但由于元素是无符号 16 位整数(两个字节),当您访问 uint16View[0] 时,它将采用第一个两个字节,然后将它们还给您。所以0000000100000010,即100000010,没有前导零。

如果您将此数据解释为以 10 为底的(十进制)整数,您将知道它是 0000000100000010 到以 10 为底的 (258)。

Uint8ArrayUint16Array 本身都不存储任何数据。它们只是访问ArrayBuffer 中字节的不同方式。

如何选择使用哪一个?它不是基于偏好,而是基于基础数据。 ArrayBuffer 用于当您从某个外部源(可能是 Web 套接字)接收一些二进制数据并且已经知道数据代表什么时。它可能是一个无符号 8 位整数列表,或者一个有符号 16 位整数列表,甚至是一个混合列表,其中您知道第一个元素是 8 位整数,下一个元素是 16 位整数。然后您可以使用DataView 从中读取键入的项目。 如果您不知道数据代表什么,则无法选择使用什么。

【讨论】:

  • 令人印象深刻的答案!为彻底性 +1。
  • 如果我不打算使用 DataView 并且只需要创建 ArrayBuffer 的视图以便 JSONify 并通过 AJAX 请求发送它只是为了反序列化它,我猜数据格式无关紧要?除了 Uint8Array 更快?
  • 您根本看不到任何区别。所有这些都只是“视图”——解释数据的方式。数据本身存储在缓冲区中。
猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 2021-10-17
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多