JavaScript读写二进制数据的方法详解(2)

这就涉及到字节顺序的概念。在我们的个人笔记本上一般都是小端字节序。小端字节序体现在我们这个示例中即是 41、30的二进制顺序,我们刚才的计算顺序有问题,那按照 41、30 的二进制顺序计算一下

parseInt(10100100011110, 2) //输出 10526

可以看到输出结果是 10526,和我们直接使用 int16Array[0]

得出的结果一致。

上面这个例子,告诉我们在换数据结构解析 buffer 的时候,数据会变得不容易理解,我们一定要谨慎处理。

属性和方法

类型化数组实例化的对象包含一些很有用的属性和方法:

length

length属性返回类型化数组的数据成员个数。

byteLength

返回类型化数组的字节长度。注意与length的区别。通长 byteLength = length * 每个数据占用字节数

byteOffset

返回该类型化数组的数据从所处 buffer 中的哪个字节开始。

buffer

类型化数组对应的 buffer。

set

复制数组,将某段内存中的数据完整地复制到另一段内存。

let a = new Uint8Array(12); a[0] = 31; a[1] = 32; let b = new Uint8Array(12); b.set(a);

上面这段代码的意思是将 a 这段buffer中的内容,完整地拷贝到 b 这段 buffer 中,这种方式比按索引赋值要快速地多。
当然,set 支持从某个索引开始复制数据

let a = new Uint8Array(12); a[0] = 31; a[1] = 32; let b = new Uint8Array(10); b.set(a, 2);

上面这段代码意思是从b的第三个索引位置开始复制 a 中的数据。

subarray

subarray的意思是对一个类型化数组,取其子数组的内容,返回一个新的类型化数组。

let a = new Uint8Array(8); a[2] = 1; let b = a.subarray(2,3); console.log(b.length); console.log(b.byteLength);

subarray 的第一个参数,代表从源数组的第几个索引开始截取,第二个参数代表截取到第几个索引。

混合视图

有一点需要注意,我们的类型数组初始化的时候,可以指定 buffer的某一段,这就意味着,我们可以对一段 buffer 内存区域指定多个类型数,我们称之为 混合视图。

let buffer = new Buffer(8); let idArray = new Int8Array(buffer, 0,2); let nameArray = new Int8Array(buffer, 2, 4); let ageArray = new Int8Array(buffer, 6, 2);

我们用一段内存区域表示一个人的 id、name、age。这种结构类似于 C 语言中的 struct 。

JavaScript读写二进制数据的方法详解

我们将一段 8 个字节的内存分成三个部分:

字节 0 ~ 字节 1 代表 id。

字节 2 ~ 字节 5 代表 username。

字节 6 ~ 字节 7 代表 age。

DataView

JavaScript 还引入了另外种视图DataView,也能达到操作 buffer 的目的,但相比之下,DataView 操作粒度更细一些,而且还能够设置字节序为大端还是小端。

DataView 的构造函数:

DataView(ArrayBuffer对象 buffer, 从 buffer 的第几个字节开始读取, 读取的长度);

举个例子来说:

let buffer = new ArrayBuffer(10); let view = new DataView(buffer);

如何读取?

我们创建好了视图 view, 那该如何读取呢?

getInt8(index, order):从第 index 个字节读取一个 8 位整数。

getUint8(index, order):从第 index 个字节开始读取一个无符号的 8 位整数。

getInt16(index, order):从第 index 个字节开始读取 2 个字节,返回一个 16 位整数。

getUint16(index, order):从第 index 个字节开始读取 2 个字节,返回一个无符号的 16 位整数。

getInt32(index, order):从第 index 个字节开始读取 4 个字节,返回一个32位的整数。

getUint32(index, order):从第 index 个字节开始读取 4 个字节,返回一个无符号的 32 位整数。

getFloat32(index, order):从第 index 个字节开始读取 4 个字节,返回一个 32 位 浮点数。

getFloat64(index, order):从第 index 个字节开始读取 8 个字节,返回一个 64 位的浮点数。

JavaScript 提供了 8 种读取方式,功能很简单,也很容易理解,这里就不一一做示例了,大家可以自己试一下。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/a8576e51cdf90c56cbf491fc034e8c45.html