本文主要是介绍DWG 2004格式解析系列(四) BITCODE,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在学习了如何解析DWG的结构后,接下来就是解读各SECTION的内容。不过,在这之前仍然有一件事是必需要了解的,那就是DWG中的数据流的编码格式。Autodesk大概是为了减小保存文件的尺寸,将数据流按位进行了编码(个别section仍然是以字节为单位编码,如Preview),所以,本节只讲位码的编排格式。
0,我总是打头阵
编码名称 | 含义 |
---|---|
B | 1位 |
BB | 2位 |
3B | 1-3位 |
BS | Bit Short |
BL | Bit Long |
BLL | Bit Long Long |
BD | Bit Double |
DD | BitDouble with Default |
RC | Raw Char |
RS | Raw Short |
RD | Raw Double |
RL | Raw Long |
MC | Modular Char |
MS | Modular Short |
H | Handle refeance |
TV | Ansi Text |
TU | Unicode text |
T | TV for 2004-, TU for 2007+ |
以下编码 | 只是为了便于简短表述或者方便读入代码的书写 |
2BD | 2D point (2 bitdoubles) |
3BD | 3D point (3 bitdoubles) |
2RD | 2 raw doubles |
3RD | 3 raw doubles |
BE | Bit Extrusion |
BT | Bit Thickness |
CMC | Object color |
ENC | Entity color |
OT | Object Type |
1, B
只有1位,表示0或1,通常用于开关属性。
2, 2B
连续2位,表示0-3
3,3B
连续1到3位,最少1位,最多3位。先从流中读出一位,如果是0,停止,否则继续读下一位,直到遇到0或读满3位。它得表示范围是0到7。
4,BS
前2位 | 结果 |
---|---|
00 | 后跟一个short值(2字节) |
01 | 后跟一个unsigned char(1 字节) |
10 | 表示0,后面无数据 |
11 | 表示256,后面无数据 |
举例:
假设有这样的位流:0000000001000000011011010000111110,要读取5个short值,则按如下顺序解读
[00]00000001,00000001[10][11][01]00001111[10],即
00 00000001 00000001: 257
10: 0
11: 256
01 00001111:15
10:0
5,BL
前2位 | 结果 |
---|---|
00 | 后跟一个long值(4字节) |
01 | 后跟一个unsigned char(1 字节) |
10 | 表示0,后面无数据 |
11 | 表示256,后面无数据 |
举例:
假设有这样的位流:000000000100000001000000000000000010010000111110,全部是BitLong编码,则按如下顺序解读
[00]00000001,00000001,00000000,00000000[10][01]00001111[10],即
00 00000001,00000001,00000000,00000000:257
10:0
01 00001111 :15
10:0
6,BLL
前3位表示的数字,后面就跟着几个字节表示longlong值。
7,BD
前2位 | 结果 |
---|---|
00 | 后跟一个double值(8字节IEEE) |
01 | 表示1.0,后面无数据 |
10 | 表示0.0,后面无数据 |
11 | 未用 |
8,BDD
读入这种编码的数值,必须要提供一个默认值。
前2位 | 结果 |
---|---|
00 | 后面无数据,使用默认值 |
01 | 后面跟4个字节,并这4个字节替换默认值的前4个字节 |
10 | 后面跟6个字节,用其前2个字节替换默认值的5,6字节,后4个字节替换默认值的前4个字节 |
11 | 后面跟一个8字节的double值 |
9,RC,RS,RL,RD
这几个编码,其实没有编码,只需从位流中按照其原生格式读取即可。
10,MC
这是一种由不定长字节存储整型值的方法,连续读入字节,直到读到的字节其最高位为1停止,然后按规则组合成最终结果。举例说明:
假设位流10000010 00100100表示一个MC值,显然第二个字节的高位为1。
1,颠倒顺序: 00100100 10000010
2,丢弃每个字节的高位:00100100 10000010
3,将剩下的位都压到右侧:__010010 00000010
4,最高2位赋0:00010010 00000010
最后得到的值为:0x1202
又假设位流11101001 10010111 11100110 00110101也表示一个MC,注意第四个字节的高位为1。
1,颠倒顺序:00110101 11100110 10010111 11101001
2,丢弃每个字节的最高位:00110101 11100110 10010111 11101001
3,将剩下的位都压到右侧: ____0110 10111001 10001011 11101001
4,最高4位赋0:00000110 10111001 10001011 11101001
最终结果为:0x06B98BE9
这里有个需要注意的地方就是,负数怎么表示?
读入的最后一个字节的第7位如果是1,则表示,这个MC的值是负数。如 10000101 01001011
0,将最后一个字节的负数标志位赋0:10000101 00001011
1,颠倒顺序: 00001011 10000101
2,丢弃每个字节的最高位:00001011 10000101
3,将剩下的位都压到右侧:__000101 10000101
4,将最高2位赋0:00000101 10000101
5,计算:0x0585 = 1413
6,最后取相反数,得 -1413
可见负数比正数的解码多了2步。
11,MS
与MC类似,这里的基本单位是short,而非char。
解码方式也和MC类似,但是要注意的是,颠倒顺序时,不仅所有的short要颠倒顺序,而且每个short内部的两个字节也要颠倒顺序,后续操作按MC的方式进行即可。就不举例了。
12,H
从R13开始,dwg中所有对象都有一个句柄(Handle)与之关联以方便检索。
Handle在位流中存储格式为:code|counter|value
项目 | 长度 | 含义 |
---|---|---|
code | 4位 | handle的类型 |
counter | 4位 | value的字节数 |
value | counter个字节 | handle value 或 offset |
视乎code值的不同,value有不同的含义。
code | counter | value含义 | 真正句柄值 |
---|---|---|---|
0x2,0x3,0x4,0x5 | >0 | handle value | value |
0x6 | 0 | - | 参考值+1 |
0x8 | 0 | - | 参考值-1 |
0xA | >0 | offset | 参考值+offset |
0xC | >0 | offset | 参考值-offset |
表中的参考值可从位流中对象的上下文中取得。
13,TV
2004及之前的字符串。
一个BS表示的字节数(length),后跟length个’\0’结尾的char代表的字符串。
14,TU
2007+版本的字符串。
一个BS表示的双字节字符数(chars),后跟chars个’\0\0’结尾的short代表的字符串。
15,2BD,2RD,3BD,3RD
连续的BD或RD
16,BE
根据版本不同读入extrusion,3个double值。
17,BT
根据版本不同,读入Thickness,1个double值。
18,CMC/ENC
根据版本不同,读入Object/entity的颜色。
19,OT
根据版本不同,读入Object的类型。
严格地说,BE、BT、CMC、ENC和OT不应该归到位编码这里,因为他们不涉及新的位编码格式,只是针对具体版本做不同的读取的简化写法。
以上就是位编码总结,是解析dwg中对象的基础。
这篇关于DWG 2004格式解析系列(四) BITCODE的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!