OPC UA 空数组和 null 都没元素,为什么接口里仍要分开保存

2026-10-24

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。离线结果只证明给定输入的解析或计算行为;现场兼容性、响应时间、硬件准确度和具体产品支持均未测量。

需要展厅软硬件方案或定制开发?

加微信,把这一页发到你手机上

扫码加站长企业微信,会自动把这一页的链接发给你。问软件授权、报价,或者现场遇到问题,也可以直接聊。

去留微信

留言讨论

评论发布后会被人工复核,违规内容将被删除。

    还没有人评论,来说说你的看法

    如果发表没有反应,可以前往联系我们告诉我们。

    这个页面有问题?

    提交时会附带当前页面地址和浏览器信息,帮助我们定位问题。不填联系方式即为匿名。