dwg文件格式解析

您所在的位置:网站首页 dwg是什么格式的文档 dwg文件格式解析

dwg文件格式解析

2022-06-12 21:30| 来源: 网络整理| 查看: 265

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

0,我总是打头阵 编码名称含义B1位BB2位3B1-3位BSBit ShortBLBit LongBLLBit Long LongBDBit DoubleDDBitDouble with DefaultRCRaw CharRSRaw ShortRDRaw DoubleRLRaw LongMCModular CharMSModular ShortHHandle refeanceTVAnsi TextTUUnicode textTTV for 2004-, TU for 2007+以下编码只是为了便于简短表述或者方便读入代码的书写2BD2D point (2 bitdoubles)3BD3D point (3 bitdoubles)2RD2 raw doubles3RD3 raw doublesBEBit ExtrusionBTBit ThicknessCMCObject colorENCEntity colorOTObject 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 valuevalue0x60-参考值+10x80-参考值-10xA>0offset参考值+offset0xC>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中对象的基础。 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3