首页 理论教育 智慧建筑集成技术-值编码及整数编码规则

智慧建筑集成技术-值编码及整数编码规则

时间:2023-11-06 理论教育 版权反馈
【摘要】:表6-2布尔类型编码2. 整数类型0~255 的整数可以在一个字节中编码,大于255 的需要2、4 或8 个字节,暂时不支持64 位以外的数字。表6-3整数编码根据表6-1 整数int 的Obj 代码是0x0C,在第一个示例中,该值可以编码为无符号的8 位数,因此我们使用值代码0x00 加上0x0C,后边是34 的十六进制表示22。年份通过16 位整数编码表示实际年份,月份为1 到12 之间的8 位整数,而日期为1 到31 之间的8 位整数。状态facet 是内联编码的,以避免消耗额外的字节。

智慧建筑集成技术-值编码及整数编码规则

每个obj 和facet 类型有一个关联的编码值,例如,编码facet precision 我们必须指定facet 代码0x40 加facet 的整数值。对象类型bool、int、枚举、实数、字符串、uri、abstime、reltime、日期和时间表明它们是有值编码(相当于XML中的val 属性)。

1. 布尔类型

布尔型编码如表6-2 所示,Obj 代码的布尔型是0x08,当val 为假时,这个值与0 代码按位相或,得到的完整编码是一个字节0x08;当val 为真,0x08 与0x01 相加,得到0x09。

表6-2 布尔类型编码

2. 整数类型

0~255 的整数可以在一个字节中编码,大于255 的需要2、4 或8 个字节,暂时不支持64 位以外的数字。整数编码如表6-3 所示,Obj 整型代码为0x0c,首字节OBbj 类型码和数值列相加,后续字节为该数值的十六进制编码。

表6-3 整数编码

根据表6-1 整数int 的Obj 代码是0x0C,在第一个示例中,该值可以编码为无符号的8 位数,因此我们使用值代码0x00 加上0x0C,后边是34 的十六进制表示22。第二个示例是u2 编码,因此我们使用值代码0x01 加上0x0C 以获得0x0D,然后使用另外两个字节将2093 编码为16 位无符号整数。其他示例说明了如何在s4 和s8 中编码值,编码器应该适当的编码类型,从而产生最少的字节数。

3. 实数类型

OBIX 二进制编码支持IEEE 754 标准的短实数和长实数,暂不支持临时实数。编码说明如表6-4 所示,首字节Obj 类型码和数值列相加,后续字节为该实数的IEEE 754 编码。

表6-4 实数编码

4. 字符串类型

字符串编码被用于描述许多对象和facet 值,每当在给定文档中给字符串编码时,都会为其分配以0 开始的索引号。编码为utf8 的第一个字符串分配为0,第二个字符串分配1,以此类推,如表6-5 所示。如果后续字符串值具有完全相同的值,则使用prev 值编码通过其索引号引用前一个字符串。这需要二进制解码器在解码期间跟踪所有字符串,因为文档中的后续出现可能引用该字符串。

表6-5 字符串编码

来看一个空字符结尾的字符串的简单例子:

相同值的两个字符串的复杂例子:

第一个字节0x84 是被屏蔽的Obj 代码,下一个字节0x04 表明子对象的hasChildren 标记,下一个字节是被utf8 值代码0x00 和字符串对象编码0x14 的和,后面是61 62 63 00 的“abc”编码。下一个字节0x15 是prev 值代码0x01和字符串对象的类型码0x14 之和;之后0x00 是索引0 的u2(十六位无符号整数)编码,它引用字符串值零“abc”;下一个0x00 是结尾空字符;最后一个字节0x44 是子元素结束的标记符。

5. 绝对时间

OBIX 起始时间戳定义为世界标准时2000 年1 月1 日零点,编码分为秒编码和纳秒编码两种,见表6-6。这个时间之前被表示为负数,秒编码提供了一个±68 年的范围,纳秒编码提供了一个±292 年的范围,不支持这个范围之外的时间戳。

表6-6 绝对时间编码

(www.xing528.com)

例子:

第一个例子编码为0x00263b80,这在OBIX 时间中相当于十六进制29×24×60×60 秒。第二个例子演示一个在OBIX 起始时间之前的负数秒时间戳。最后一个例子展示了一个64 位的纳秒编码。

6. 相对时间

该类型用于表示时间的相对持续时间。如表6-7 所示,提供一个秒和纳秒编码,不支持任何没有映射到固定秒数的模糊时间,如1 个月。

表6-7 相对时间编码

例子:

7. 时间类型

如表6-8 所示,时间编码过程类似于reltime 编码,都是使用秒或纳秒。

表6-8 时间编码

例子:

8. 日期类型

如表6-9 所示,日期使用4 个字节进行编码。年份通过16 位整数编码表示实际年份,月份为1 到12 之间的8 位整数,而日期为1 到31 之间的8 位整数。

表6-9 日期编码

例子:

上述例子中,28 为date 对象编码;前2 个字节07D9 为2009 的十六进制,表示年份;0A 表示10 月,14 表示20 日。

9. 状态类型

如表6-10 所示,节点状态共有7 种,我们只使用值编码中的2 位来进行编码。状态facet 是内联编码的,以避免消耗额外的字节。由于有8 个状态值,但值编码只有2 位,我们使用2 个不同的facet 代码(status-0、status-1)来为我们提供所需的范围,省略状态facet 则表示ok 状态。举例如下:

表6-10 状态编码

第一个例子说明了ok 状态,整个文档用一个字节的Obj 类型代码0x40 进行编码。其余示例以0x84 开头,表示用M 位屏蔽的Obj 类型代码。从disabled到unackedAlarm 的状态值使用staus-0,从警报到覆盖使用status-1,单个对象定义status-0 或status-1 facet 代码都是不允许的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈