OPC UA 空数组和 null 都没元素,为什么接口里仍要分开保存
UA二进制数组长度是小端Int32,-1表示null,0表示空数组。两者都没有元素,但转换接口应保留编码状态,不要用“元素数为零”或真假值把None与[]合并;若应用主动归一化,也要明确这是应用策略。
适用版本与输入范围
依据 OPC Foundation 官方参考,v105 链接在核对时显示 v1.05.07,具体 Part 与章节见文末。示例只处理明确声明的值与结构,不实现网络会话、证书或完整服务端。 本文所有输入均为原创合成数据,未接真实设备。
长度字段先按有符号数读取
FFFFFFFF是Int32的-1,不是4294967295个元素。附件把null、empty和三个Int32值并列,程序先读带符号长度,-1单独处理,非负长度才进入元素区。若把长度当无符号数,可能尝试预分配极大的数组;若直接max(length,0),又会丢掉原始null证据。负例FFFFFFFE的小端表示-2,不属于这套长度语义,应拒绝而非视作另一个空数组。
零长度是有效的空容器
00000000表示长度零,报告state=empty、values=[],与state=null、values=None明确区分。后续数据库、JSON接口或表格若需要统一处理,应在协议解析之后做有记录的归一化,不能让读取程序无声改掉输入语义。某些服务或应用可能赋予空容器和缺失值不同含义,也可能明确视为等价;本题不替所有服务决定业务意义,只保留可观察的原始编码差异。
元素数和字节数仍要配套
本示例限定Int32数组内容,非负n需要四字节长度加4n字节元素;缺一项不补零,多出尾字节也不忽略。正例三个值7、8、9用来核对普通数组路径,显式负例只声明一个元素却没有内容,必须在解码前拒绝。其他元素类型可能是变长字符串或结构体,不能照搬4n公式。本附件输入不包含外层Variant掩码,其角色是被类型已知的数组解析层调用。
三态输出适合交接与重放
报告state、length和values同时保存,方便判断数据源实际给了null还是一个明确的空列表。若只导出逗号分隔字符串,两者往往都变成空白,重新导入时便无法恢复。程序没有浏览或读取真实节点,未测试任何SDK的缺省归一化行为;文末规范支撑二进制长度规则,应用是否允许null还需看服务和数据类型契约。实际项目应在接口文档中写明三态的序列化方式,避免前后端各自按语言默认值处理。
下载与复跑
将输入 fixture.json与独立程序 verify.py放在同一目录,用 Python 3.12 执行 python verify.py,无需安装第三方包。程序从自身目录读取输入并写入 report.json,不要求当前终端恰好位于下载目录。也可查看本次实跑报告和复跑说明。
本次实际运行通过 5 条输入断言,包括标有“显式负例”的记录;负例以JSON字段承载,不会把下载文件本身做成损坏编码。state保留编码三态;values=None和[]不能在解析层无声合并,业务是否等价需另有契约。 修改输入后应同时审查期望结果,不能只改断言数字让测试变绿。
对象或字段的基础关系可回到楼宇与工业数据接入链路核对,更多接口入口在设备协议库。若需要把已确认的数据点接入展项编排,可了解SoftControl 展厅中控;具体接入能力以项目确认和实际测试为准。
一级依据
来源核对日期:2026-10-24。离线结果只证明给定输入的解析或计算行为;现场兼容性、响应时间、硬件准确度和具体产品支持均未测量。
相关阅读
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。