DWG 2004格式解析系列(四) BITCODE

在学习了如何解析DWG的结构后,接下来就是解读各SECTION的内容。不过,在这之前仍然有一件事是必需要了解的,那就是DWG中的数据流的编码格式。Autodesk大概是为了减小保存文件的尺寸,将数据流按位进行了编码(个别section仍然是以字节为单位编码,如Preview),所以,本节只讲位码的编排格式。

0,我总是打头阵

编码名称含义
B1位
BB2位
3B1-3位
BSBit Short
BLBit Long
BLLBit Long Long
BDBit Double
DDBitDouble with Default
RCRaw Char
RSRaw Short
RDRaw Double
RLRaw Long
MCModular Char
MSModular Short
HHandle refeance
TVAnsi Text
TUUnicode text
TTV for 2004-, TU for 2007+
以下编码只是为了便于简短表述或者方便读入代码的书写
2BD2D point (2 bitdoubles)
3BD3D point (3 bitdoubles)
2RD2 raw doubles
3RD3 raw doubles
BEBit Extrusion
BTBit Thickness
CMCObject color
ENCEntity color
OTObject 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

项目长度含义
code4位handle的类型
counter4位value的字节数
valuecounter个字节handle value 或 offset

视乎code值的不同,value有不同的含义。

codecountervalue含义真正句柄值
0x2,0x3,0x4,0x5>0handle valuevalue
0x60-参考值+1
0x80-参考值-1
0xA>0offset参考值+offset
0xC>0offset参考值-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中对象的基础。
在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值