JS类型化数组视图 - Typed Arrays

在进行音频视频编辑,访问WebSockets的原始数据等,有些时候如果使用JavaScript代码可以快速方便地通过类型化数组来操作原始的二进制数据。
注意:(不要把类型数组与正常数组混淆,无法再类型数组上调用Array.isArray(arr),不是所有可用于正常数组的方法都能被类型数组所支持)

Typed Arrays

类型数组架构:缓冲和视图

类型数组是由缓冲与视图两部分组成,一个缓冲(由ArrayBuffer对象实现)描述的是一个数据块。缓冲是没有格式可言的,并且不提供机制访问其内容。所以为了访问缓冲对象中包含的内存,你需要使用视图(提供了上下文 — 即数据类型、起始偏移量和元素数 — 将数据转换为实际有类型的数组)。

ArrayBuffer

ArrayBuffer 是一种数据类型,用来表示一个通用的、固定长度的二进制数据缓冲区。你不能直接操纵一个ArrayBuffer中的内容;你需要创建一个类型化数组的视图或一个描述缓冲数据格式的DataView,使用它们来读写缓冲区中的内容.

类型数组视图

类型化数组视图具有自描述性的名字和所有常用的数值类型像Int8,Uint32,Float64 等等。有一种特殊类型的数组Uint8ClampedArray。它仅操作0到255之间的数值。例如,这对于Canvas数据处理非常有用。

数据视图

DataView 是一种底层接口,它提供有可以操作缓冲区中任意数据的读写接口。这对操作不同类型数据的场景很有帮助,例如:类型化数组视图都是运行在本地字节序模式(参考 Endianness),可以通过使用 DataView 来控制字节序。默认是大端字节序(Big-endian),但可以调用读写接口改为小端字节序(Little-endian)。

示例:
var buffer = new ArrayBuffer(16); //创建一个16字节固定长度的缓冲 if(buffer.byteLength === 16){ //确认数据字节长度 console.log('true'); }else{ console.log('false'); } var int32View = new Int32Array(buffer); //创建视图(格式化数据(缓冲中的内存)以32位有符号证书数组显示) int32View.map((item,index) =>index*2) //[0,2,4,6] (一共4个4字节元素,总长度为16字节) var int16View = new Int16Array(buffer); //创建2字节整数视图(此视图会共享缓冲,并以2字节整数打印出缓冲中的数据)[0,0,2,0,4,0,6,0]
同一数据可以创建多个视图,操作视图会直接修改缓冲中的数据,因此视图也会相应改变
int16View[0] = 32; console.log("Entry 0 in the 32-bit array is now " + int32View[0]);

附:类型数组对应C中数据类型

TypeValue RangeSize in bytesDescriptionWeb IDL typeEquivalent C type
Int8Array-128 to 12718-bit two’s complement signed integerbyteint8_t
Uint8Array0 to 25518-bit unsigned integeroctetuint8_t
Uint8ClampedArray0 to 25518-bit unsigned integer (clamped)octetuint8_t
Int16Array-32768 to 32767216-bit two’s complement signed integershortint16_t
Uint16Array0 to 65535216-bit unsigned integerunsigned shortuint16_t
Int32Array-2147483648 to 2147483647432-bit two’s complement signed integerlongint32_t
Uint32Array0 to 4294967295432-bit unsigned integer unsignedlonguint32_t
Float32Array1.2x10-38 to 3.4x1038432-bit IEEE floating point number ( 7 significant digits e.g. 1.1234567)unrestricted floatfloat
Float64Array5.0x10-324 to 1.8x10308864-bit IEEE floating point number (16 significant digits e.g. 1.123…15)unrestricted doubledouble
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值