BACnet反序列化:我如何知道一个新的列表元素是否开始



我正在实现一个通用的BACnet解码器,并遇到以下问题,其中我似乎无法在BACnet标准中找到答案。"20.2.1.3.2构造数据"一章没有回答我的问题,或者我可能没有完全理解它。

假设我有一个List (SEQUENCE OF),其元素类型为Record (SEQUENCE)。所述记录有4个字段,由上下文标记标识,其中字段0和1是可选的。我进一步假设这些字段序列化的顺序可以是任意的(因为它们是由它们的上下文标记标识的)。数据可能看起来像这样(数字表示字段/列):[{"3", "0", "2"}, {"1", "2", "3"}]

在电线上,我认为我得到的唯一"结构信息"是列表的打开/关闭标记。这意味着:

Open Tag List
  ctxTagColumn3, valueColumn3,
  ctxTagColumn0, valueColumn0,
  ctxTagColumn2, valueColumn2,
  ctxTagColumn1, valueColumn1,
  ctxTagColumn2, valueColumn2,
  ctxTagColumn3, valueColumn3
Close Tag List

我怎么知道,在我读取了第一个列表项的最后一列数据("2")之后,我必须开始解码第二个项目,从列"1"的值开始?

我的哪个假设是错的?

谢谢你并致以亲切的问候

帕斯卡

SEQUENCE的元素顺序总是已知的,不能任意定义。此外,并非所有可能的组合都可以编码。对于BACnet,所有类型定义都应该是通用可解码的。

如果我没理解错的话;"order"不能为"任意";例如:

SEQUENCE = *ordered* collection of variables of **different** types
SEQUENCE OF = *ordered* collection of variables of **same** type

项目(SD)上下文标签的标签编号将与包含(PD)上下文标签不同(/可能是一个递增的值/可能是+1);所以你可以检查一下,或者更好的是,如果tag-number值是<= 5 (/'length'值),那么它是一个SD上下文标签为你的项目之一,而不是(/关闭)PD上下文标签(/'type'值)分隔项目的结束。

最新更新