ActionScript
TypeScript
JavaScript

了解二进制数据

发布时间:2017-01-10

        传统意义上的JavaScript是没有二进制的操作的,但是HTML5的兴起,诞生了很多新的特性,一大进步就是webgl的出现,所谓WebGL,就是指浏览器与显卡之间的通信接口,为了满足JavaScript与显卡之间大量的、实时的数据交换,它们之间的数据通信必须是二进制的,而不能是传统的文本格式。所以HTML5 对于二进制的操作开放了一系列的接口和数据类型,很重要的一个就是类型化数组(TypedArray)。


        类型化数组(或称视图view)是读写ArrayBuffer中数据的接口,JS可以通过8种不同的接口创建类型化数组,分别为:

名称

描述

字节长度

Int8Array

8位有符号整数

1

Uint8Array

8位无符号整数

1

Int16Array

16位有符号整数

2

Uint16Array

16位无符号整数

2

Int32Array

32位有符号整数

4

Uint32Array

32位无符号整数

4

Float32Array

32位浮点数

4

Float64Array

64位浮点数

8

        由于类型化数组的操作繁琐而且接口api繁多,考虑到游戏的通用性,LayaAir遵循传统webgame开发者的习惯,用Byte进行了封装,通过这个类的操作来完成对二进制的操作,假如你对Html5的类型化数组有兴趣或者自己想进行封装,请参考w3c的具体的接口。这个不是本节的重点,不在进行赘述。


二进制的读写:

        二进制的读写取必须要注意的是大小端。这一点是非常容易忽略。有时候明明写对了,读取的时候就是乱码,很可能就是大小端设置错了。那么什么是大小端呢?

        所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;

        所谓的小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

        为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。



        对于大小端的详细讲解本节不再阐述。那么在LayaAir引擎中是怎么使用呢。下面我们通过例子来看看。

打开LayaAirIDE,新建LayaAir空项目,选择Actionscript3.0 项目。

类代码如下:

blob.png