javascript ArrayBuffer的作用是什么?


78

也许是时候晚了,或者是缘故,但我只是阅读了ArrayBuffer的文档,无法想到它真正有用的任何东西。

有人可以启发我吗?

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


嗯,似乎node.js会喜欢此低级IO相关代码。
科尔宾

4
从无意识的记忆中,我记得这些东西是用来保存二进制数据(如图像的二进制数据)来操纵和存储/发送它的。另外,如果您在应用程序上工作,那么您会知道缓冲区非常有用。而HTML 5现在已经超出了网络编程...
Imdad

我想@Imdad是正确的。HTML5 canvas上下文具有一种getImageData返回绘制图像的许多属性的方法,包括一种称为buffer类型的属性ArrayBuffer
Danilo Valente

Answers:


62

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

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

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

Mozilla站点在此处仅少量使用了ArrayBuffer

处理复杂的数据结构

通过将单个缓冲区与不同类型的多个视图组合在一起(从缓冲区的不同偏移量开始),您可以与包含多种数据类型的数据对象进行交互。例如,这使您可以与使用js-ctypes时需要使用的WebGL,数据文件或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结构中的数据结构对齐方式取决于平台。请注意这些填充差异的注意事项和注意事项。


2
因此,如果您已经知道要使用纯无符号的8位数据,是否可以假设不需要ArrayBuffer,还可以创建一个Uint8Array并填充它?Blob和FileReader怎么样-它们似乎可以在ArrayBuffer上工作?至少那是我通常在javascript中处理二进制文件的方式。
Johncl


Idview应该采取4个字节而不是1
Royi纳米尔

通过示例判断,想法是length参数是元素数,而不是字节数。尝试new Int32Array(Uint8Array.from([1,2,3,4]).buffer,0,1)测试。
aiodintsov

5

除了图像以外,它对于精确构建和销毁UDP等协议中使用的低级网络数据包很有用。


3

AnArrayBuffer代表RAM中的二进制数据。您可以ArrayBuffer使用类型化数组或来“打开” an进行读写DataView

类型化的数组(例如Uint16Array)可以通过将缓冲区视为单个整数数组来读取和写入缓冲区。它们不让您控制字节顺序;它使用平台的本地字节序。使用Uint8Array对于控制单个字节很有用(不受字节序的影响)。

DataView并不是那么简单,但是它给了您更多的控制权。它使您可以完全控制字节序,整数大小和字节索引(例如,即使不能被32位整除,也可以在索引处访问32位整数)。每次您读写具有相同整数的整数时,都可以选择这些东西DataView

这可能会有所帮助:https : //javascript.info/arraybuffer-binary-arrays

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.