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

相关文章

Mybatis Plus JSqlParser解析sql语句及JSqlParser安装步骤

《MybatisPlusJSqlParser解析sql语句及JSqlParser安装步骤》JSqlParser是一个用于解析SQL语句的Java库,它可以将SQL语句解析为一个Java对象树,允许... 目录【一】jsqlParser 是什么【二】JSqlParser 的安装步骤【三】使用场景【1】sql语

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Java 关键字transient与注解@Transient的区别用途解析

《Java关键字transient与注解@Transient的区别用途解析》在Java中,transient是一个关键字,用于声明一个字段不会被序列化,这篇文章给大家介绍了Java关键字transi... 在Java中,transient 是一个关键字,用于声明一个字段不会被序列化。当一个对象被序列化时,被

Java JSQLParser解析SQL的使用指南

《JavaJSQLParser解析SQL的使用指南》JSQLParser是一个Java语言的SQL语句解析工具,可以将SQL语句解析成为Java类的层次结构,还支持改写SQL,下面我们就来看看它的具... 目录一、引言二、jsQLParser常见类2.1 Class Diagram2.2 Statement

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

使用Java实现Navicat密码的加密与解密的代码解析

《使用Java实现Navicat密码的加密与解密的代码解析》:本文主要介绍使用Java实现Navicat密码的加密与解密,通过本文,我们了解了如何利用Java语言实现对Navicat保存的数据库密... 目录一、背景介绍二、环境准备三、代码解析四、核心代码展示五、总结在日常开发过程中,我们有时需要处理各种软

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

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

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.