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

2023-10-13 04:50

本文主要是介绍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中对象的基础。
在这里插入图片描述

这篇关于DWG 2004格式解析系列(四) BITCODE的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/200877

相关文章

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

Mysql常见的SQL语句格式及实用技巧

《Mysql常见的SQL语句格式及实用技巧》本文系统梳理MySQL常见SQL语句格式,涵盖数据库与表的创建、删除、修改、查询操作,以及记录增删改查和多表关联等高级查询,同时提供索引优化、事务处理、临时... 目录一、常用语法汇总二、示例1.数据库操作2.表操作3.记录操作 4.高级查询三、实用技巧一、常用语

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加