Python中OPC UA ExtensionObject字节串转数值失败,求解决方案
问题与解决建议
问题描述
从OPC UA服务器的ExtensionObject节点读取到字节串后,尝试用Python的struct模块解析为十进制数值,但结果明显错误。当前使用的代码如下:
import struct # Example byte string containing double values byte_string = b'\x84^\x05\x00\x00\xf7\n\x19\n\....' # Determine the size of a double in bytes double_size = struct.calcsize('!d') # Calculate the number of double values in the byte string num_values = len(byte_string) // double_size # Loop through the byte string and unpack double values for i in range(num_values): # Calculate the offset for the current double value offset = i * double_size # Unpack the double value from the byte string double_value = struct.unpack_from('!d', byte_string, offset)[0] print(double_value)
解决建议
- 确认实际数据类型:先明确ExtensionObject存储的真实数据类型,不一定是
double——可能是float、整数类型,或是带自定义结构的数据。OPC UA的ExtensionObject会携带类型标识,需先解析该标识确定数据格式。 - 调整字节序:代码中使用
!d(大端网络字节序),但服务器可能采用小端字节序,尝试替换为<d(小端)或=d(本机字节序)测试结果。 - 剥离ExtensionObject头部:ExtensionObject通常包含
TypeId、EncodingMask等头部信息,这些不是数值数据,直接从偏移0解析会导致错误。需先解析并剥离头部,再处理真正的数值部分。 - 使用OPC UA专用库:放弃手动解析,改用
opcua-asyncio或freeopcua这类专业库,它们会自动处理ExtensionObject的结构解析,直接返回对应类型的数值。
内容的提问来源于stack exchange,提问作者baixianjie
相关产品推荐
相关产品推荐

