3.1 integers类型说明3.1.1 unsigned-integerunsigned-integer的长度不确定,是由自己的值来确定的,如果数据长度有N个byte,每个byte的8个bits中只有7bits表示实际数据,最高一个bit表示后面是否还有数据。
0表示自己是最后一个byte。
最低位byte放在oasis文件的最前面。
举个例子就清楚了。
十进制的16383:正常的2进制表示是:11,1111,1111,1111,一共14个1。
在oasis文件中,由于只有7位能代表实际的数,所以我们把它写成x111,1111,y111,1111。
还是14个1。
但中间插入了一个x和y用来表示是否后面还有数据。
由于低字节优先,所以我们写成y111,1111,x111,1111。
然后将y 变成1,x变成0。
所以最后在oasis文件中的表示是1111,1111,0111,1111。
十进制的16384:正常的2进制表示是:100,0000,0000,0000,1后面一共14个0。
在oasis文件中,由于只有7位能代表实际的数,所以我们把它写成x000,0001,y000,0000,z000,0000。
1后面还是14个0。
但中间插入了一个x、y和z用来表示是否后面还有数据。
由于低字节优先,所以我们写成z000,0000,y000,0000, x000,0001。
然后将z变成1,y变成1,x变成1,。
所以最后在oasis文件中的表示是1000,0000,1000,0000, 0000,0001。
3.1.2 signed-integer知道了unsigned-integer以后,再变signed-integer就简单了。
还是举两个例子。
十进制的8191,正常的2进制表示是:1,1111,1111,1111,一共13个1。
在oasis文件中,由于第一个byte只有6位能代表实际的数,后面的byte 有7位能代表实际的数。
所以我们把它写成x111,1111,y111,111z。
还是13个1。
但中间插入了一个x和y用来表示是否后面还有数据,插入了一个z作为符号位。
由于低字节优先,所以我们写成y111,111z,x111,1111。
然后将y变成1,x变成0。
由于是正数,所以z为0。
所以最后在oasis文件中的表示是1111,1110,0111,1111。
十进制的-8192,先表示十进制的8192,正常的2进制表示是:10,0000,0000,0000,1后面一共13个0。
在oasis文件中,由于第一个byte只有6位能代表实际的数,后面的byte 有7位能代表实际的数。
所以我们把它写成m000,0001,x000,0000,y000,000z。
1后面还是13个0。
但中间插入了一个x和y用来表示是否后面还有数据,插入了一个z作为符号位,前面补了一个m。
由于低字节优先,所以我们写成y000,000z,x000,0000,m000,0001。
然后将y变成1,x变成1,m变成0。
由于是负数,所以z为1。
所以最后在oasis文件中的表示是1000,0001,1000,0000,0000,0001。
3.2 real类型说明3.3 string类型说明string数据类型是一个复合的数据类型,它由一个表示字符串长度的unsigned-integer类型数据做为开头,后面加上真正的字符串。
字符串可以分成三种:b-string(binary string),a-string(ascii string)和n-string (name string).3.4 delta类型说明delta是代表几何数据。
简单来说就是delta类型的数据中存放有长度和方向的信息。
其中分成4种:1-delta, 2-delta, 3-delta和g-delta。
分别进行说明3.4.1 1- delta1-delta是一种signed-integer的数据结构,其中signed-integer中的符号位就用来表示方向了;singed-integer中的表示数值的部分就用来表示长度。
我们举个例子。
比如二进制的1111,1001, 0010, 0011。
其中第一个方框中的1和singed-integer的含义一样,表示后面还有数据。
第二个方框中的1在signed-integer中表示正负符号,这里就表示方向,1表示向西或者向南(在正交坐标系中表示x和y轴的负方向,具体是x轴还是y轴由这个值出现的当前的场景来确定)。
第三个框中的0表示这是这个signed-integer数据的最后一个byte。
这个数据的长度是二进制的010,0011, 111, 100(去掉框内的数值,然后前后byte调转位置),这就是十进制的2300。
因此这个数值就是表示向西(或者向南)画2300长度的一条线。
3.4.2 2- delta2-delta是一种unsigned-integer的数据结构,其中unsigned-integer中的最低2bits(在oasis文件中最先出现的byte中的最低2bits)用来表示方向了,其他部分表示数值的大小,数值的大小就用来表示长度。
我们举个例子。
比如二进制的1001,1000, 0010, 1010。
其中第一个方框中的1和unsinged-integer的含义一样,表示后面还有byte表示同一个unsigned-integer数据。
第二个方框中的00这里就表示方向,00表示向东(在正交坐标系中表示x正方向,01表示向北,10表示向西,11表示向南)。
第三个框中的0表示这是这个unsigned-integer数据的最后一个byte。
这个数据的长度是二进制的010,1010, 001, 10(去掉框内的数值,然后前后byte调转位置),这就是十进制的1350。
因此这个数值就是表示向东(就是从当前位置,向x轴正方向)画长度1350的一条线。
3.4.3 3- delta3-delta是一种unsigned-integer的数据结构,其中unsigned-integer中的最低3bits(在oasis文件中最先出现的byte中的最低3bits)用来表示方向了,其他部分表示数值的大小,数值的大小就用来表示x轴和y轴的偏移长度。
我们举个例子。
比如二进制的1100,1101, 0000, 0001。
其中第一个方框中的1和unsinged-integer的含义一样,表示后面还有byte表示同一个unsigned-integer数据。
第二个方框中的101这里就表示方向,101表示西北方向(在正交坐标系中表示135度角的一条线,000表示向东,001向北,010表示向西,011表示向南,100表示东北方向,110表示西南方向,111表示东南方向)。
第三个框中的0表示这是这个unsigned-integer数据的最后一个byte。
这个数据的长度是二进制的000,0001, 100, 1(去掉框内的数值,然后前后byte调转位置),这就是十进制的25。
因此这个数值就是表示向西北方向(就是从当前位置,向135度角方向)画长度为sqrt(25*25+25*25)的一条线(x轴偏移25,y轴偏移25)。
3.4.4 g- deltag-delta有两种形式,一种是用一个单一的unsigned-integer的数据来表示;第二种是用一对unsigned-integer的数据来表示。
如果g-delta数据在文件中第一个出现的字节的最低位(bit0)是0,表示第一种类型的g-delta数据;如果是1,表示第二种类型的g-delta数据。
3.4.4.1 g- delta 第一种类型如果是第一种类型,只用一个unsigned-integer类型表示g-delta的类型。
unsigned-integer的在文件中出现的第一个字节的倒数第2到第4个bit(bit1到bit3)一共3个bits用来表示方向,同3-delta的形式。
举个例子,二进制的1110,1100,0000,0101。
其中第二个方框中的0表示这是第一种类型的g-delta格式,第一个方框中的1和unsinged-integer的含义一样,表示后面还有byte表示同一个unsigned-integer数据。
划下划线的110这里就表示方向,110表示西南方向(在正交坐标系中表示135度角的一条线,000表示向东,001向北,010表示向西,011表示向南,100表示东北方向,101表示西北方向,110表示西南方向,111表示东南方向)。
第三个框中的0表示这是这个unsigned-integer数据的最后一个byte。
这个数据的长度是二进制的000,0101, 110(去掉打框的和加下划线的数值,然后前后byte调转位置),就是十进制的46。
整个数据的含义就是沿西南方向画一条长度为sqrt(46×46+46×46)的线(也是就是将x轴坐标减少46,y坐标减少46,将这个点作为顶点,和原来坐标点相连画一条直线)。
3.4.4.2 g- delta 第二种类型如果是第二种类型,则用两个unsigned-integer的数据来表示。
第一个unsigned-integer在文件中的第一个byte的最低bit(bit0)必须为1,第一个byte的倒数第二个bit(bit1)表示x轴的方向,其它bit表示长度。
第二个unsigned-integer在文件中的第一个byte的最低bit(bit0)表示y轴的方向,其它bit表示长度。
因此,它能够表示任何方向的线段。
只有这种数据能够表示任何方向任何角度的线段,其它delta的类型都只能表示45度或者90度方向的线段。
举个例子,二进制的1011,1011,0000,0001,1011,0111,0000,1111。
其中第二个方框中的1表示这是第二种类型的g-delta格式,第一个方框中的1和unsinged-integer的含义一样,表示后面还有byte表示同一个unsigned-integer数据。
划下划线的1这里就表示方向,1表示向西(x轴负方向,0表示向东)。
第三个框中的0表示这是第一个unsigned-integer数据的最后一个byte。
这个数据的长度是二进制的000,0001, 011,10(去掉打框的和加下划线的数值,然后前后byte调转位置),就是十进制的46。
整个数据的含义就是x轴沿负方向减少长度46,取一条和y轴平行的直线。
后面y轴也取一条和x轴平行直线,两者相交得到一个点。
整个delta就是从当前位置到这个点画一条直线。
第四个方框中的1和unsinged-integer的含义一样,表示后面还有byte表示同一个unsigned-integer数据。