【问题标题】:javascript ArrayBuffer, what's it for?javascript ArrayBuffer,它有什么用?
【发布时间】:2012-07-19 04:34:32
【问题描述】:

也许是太晚了,也许是因为,但我只是阅读了ArrayBuffer 的文档,想不出任何一个真正有用的东西。

谁能启发我?

有没有任何人能想到的不涉及图像的用途?

【问题讨论】:

  • 嗯,似乎 node.js 会喜欢这个用于低级 IO 相关代码。
  • 从无意识的记忆中我记得这些东西是用来保存二进制数据(如图像的二进制数据)来操作和存储/发送它的。另外,如果您从事应用程序工作,那么您会知道缓冲区非常有用。 HTML 5 现在已经超越了网络编程......
  • 我猜@Imdad 是对的。 HTML5 画布上下文有一个方法getImageData,它返回绘制图像的许多属性,包括buffer 类型的ArrayBuffer

标签: javascript


【解决方案1】:

基本上 ArrayBuffer 用于保存二进制数据。例如,可以是图像的二进制数据。

在其他语言中,缓冲区被证明非常有用。是的,当然它比其他数据类型更难理解/使用。

ArrayBuffer 可用于获取 jpg 图像的数据(RGB 字节)并通过添加 alpha 字节(即 RGBA)从中生成 png。

Mozilla 网站已经对 ArrayBuffer here 进行了少量使用

处理复杂的数据结构

通过将单个缓冲区与不同类型的多个视图相结合, 从缓冲区的不同偏移量开始,您可以与 包含多种数据类型的数据对象。这让你,因为 例如,与来自WebGL、数据文件的复杂数据结构进行交互, 或使用js-ctypes时需要使用的C结构。

考虑这个 C 结构:

struct someStruct {  
  unsigned long id;  
  char username[16];  
  float amountDue;  
};  

您可以像这样访问包含这种格式数据的缓冲区:

var buffer = new ArrayBuffer(24);  

// ... read the data into the buffer ...  

var idView = new Uint32Array(buffer, 0, 1);  
var usernameView = new Uint8Array(buffer, 4, 16);  
var amountDueView = new Float32Array(buffer, 20, 1);  

然后您可以访问,例如,应付金额 amountDueView[0].

注意: C 结构中的data structure alignment 是 平台相关。采取预防措施和考虑这些 填充差异。

【讨论】:

  • 如果您已经知道自己正在使用例如 ArrayBuffer ,那么可以假设它是不必要的。纯无符号 8 位数据,您不妨创建一个 Uint8Array 并填充它? Blob 和 FileReader 怎么样——它们似乎在 ArrayBuffer 上工作?至少这就是我通常在 javascript 中处理二进制文件的方式。
  • Idview 应该占用 4 个字节而不是 1
  • 的想法是,长度参数是元素的数量,而不是字节,由示例判断。尝试new Int32Array(Uint8Array.from([1,2,3,4]).buffer,0,1) 进行测试。
  • 除了提供来自 Mozilla 网站的复制粘贴之外,这实际上并没有增加答案。
【解决方案2】:

ArrayBuffer 是 RAM 中的一大块二进制数据。有几种方法可以“打开”ArrayBuffer 进行读写:

  • Typed arrays,例如Uint16Array,可以通过将缓冲区视为整数数组来读取和写入缓冲区。他们不允许你控制endianness;它使用 CPU 的首选字节序。 Uint8Array 可用于控制单个字节(复制、切片等)。

  • DataView 没有那么简单,但它给了你更多的控制权。它允许您选择字节顺序、整数大小和字节索引(例如,您可以在不能被 32 位整除的索引处访问 32 位整数)。每次读取和写入具有相同DataView 的整数时,都可以指定这些内容。

更多信息:https://javascript.info/arraybuffer-binary-arrays

【讨论】:

    【解决方案3】:

    除了图像之外,它还可以用于精确构造和破坏 UDP 等协议中使用的低级网络数据包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多