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

相关文章

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

使用Java实现一个解析CURL脚本小工具

《使用Java实现一个解析CURL脚本小工具》文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KVMap结构,获取URL路径、请求类型,解析UR... 目录使用示例实现原理具体实现CurlParserUtilCurlEntityICurlHandler

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s