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

相关文章

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

C#中DateTime的格式符的实现示例

《C#中DateTime的格式符的实现示例》本文介绍了C#中DateTime格式符的使用方法,分为预定义格式和自定义格式两类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录DateTime的格式符1.核心概念2.预定义格式(快捷方案,直接复用)3.自定义格式(灵活可控

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

使用C#导出Excel数据并保存多种格式的完整示例

《使用C#导出Excel数据并保存多种格式的完整示例》在现代企业信息化管理中,Excel已经成为最常用的数据存储和分析工具,从员工信息表、销售数据报表到财务分析表,几乎所有部门都离不开Excel,本文... 目录引言1. 安装 Spire.XLS2. 创建工作簿和填充数据3. 保存为不同格式4. 效果展示5

C++ 多态性实战之何时使用 virtual 和 override的问题解析

《C++多态性实战之何时使用virtual和override的问题解析》在面向对象编程中,多态是一个核心概念,很多开发者在遇到override编译错误时,不清楚是否需要将基类函数声明为virt... 目录C++ 多态性实战:何时使用 virtual 和 override?引言问题场景判断是否需要多态的三个关

Springboot主配置文件解析

《Springboot主配置文件解析》SpringBoot主配置文件application.yml支持多种核心值类型,包括字符串、数字、布尔值等,文章详细介绍了Profile环境配置和加载位置,本文... 目录Profile环境配置配置文件加载位置Springboot主配置文件 application.ym

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三