Data 编解码
头文件:<dlt698/codec/data_codec.hpp>,命名空间 dlt698::codec。
两套接口
需要解析一段字节里的多个字段(例如先读 OAD 再读 Data)时用组合形式,它们能保留 Reader 游标;只是编解码单个完整结构时用 decode_data/encode_data,错误已经转成 Result。
完整输入接口
decode_data 内部把 DecodeFailure 转成 Result 错误,并保证:
- 拒绝尾随字节。 输入必须只包含一个 Data,多余字节返回
trailing_data。 - 检查资源上限。 字节数、节点总数(
max_elements,含根节点)、嵌套深度(max_depth,根为 0)都会检查。 - 不猜测未知标签。 保留或未实现的标签返回
unsupported_tag。
组合式接口
read_data从当前位置读一个 Data,保留其后的字节供继续解析。write_data向现有输出追加一个带标签的 Data;输出字节上限由Writer创建时决定。- 两者都会抛
DecodeFailure。 depth是当前根节点的起始嵌套深度,通常为零。
:::warning 两个容易忽略的点
- 节点预算在每次调用时重新计数。
read_data/write_data的max_elements只约束本次调用读写的这一棵树,不是整条消息的累计值。需要整条消息的总预算时,自己在更高层限制数量。 write_data失败时不回滚。 已经追加的字节会留在Writer里。失败后请丢弃整个Writer,不要试图继续写。 :::
典型用法:
解析侧:
A-XDR 长度域
读取要求采用最短编码形式。不定长形式、非最小编码、长度值超过 limit 都会抛 DecodeFailure(对应 invalid_length 或 invalid_value)。写入同样使用最短形式。
OAD
这两个函数只处理四字节 OAD 内容(OI 两字节 + 属性字节 + 索引字节),不附加 Data 类型标签。写入时属性字节的特征位原样保留。
校验往返
编解码是互逆的,可以在测试里直接断言:
float32 的 NaN 走原始位往返,比较时不要用相等判断。日期时间保持原始字段和通配值(FF/FFFF),不做日历校验,也不附加本机时区。