每个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 代码都是不允许的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。