def nodeid_from_binary(data): encoding = ord(data.read(1)) nidtype = ua.NodeIdType(encoding & 0b00111111) uri = None server_idx = None if nidtype == ua.NodeIdType.TwoByte: identifier = ord(data.read(1)) nidx = 0 elif nidtype == ua.NodeIdType.FourByte: nidx, identifier = struct.unpack("<BH", data.read(3)) elif nidtype == ua.NodeIdType.Numeric: nidx, identifier = struct.unpack("<HI", data.read(6)) elif nidtype == ua.NodeIdType.String: nidx = Primitives.UInt16.unpack(data) identifier = Primitives.String.unpack(data) elif nidtype == ua.NodeIdType.ByteString: nidx = Primitives.UInt16.unpack(data) identifier = Primitives.Bytes.unpack(data) elif nidtype == ua.NodeIdType.Guid: nidx = Primitives.UInt16.unpack(data) identifier = Primitives.Guid.unpack(data) else: raise UaError(f'Unknown NodeId encoding: {nidtype}') if test_bit(encoding, 7): uri = Primitives.String.unpack(data) if test_bit(encoding, 6): server_idx = Primitives.UInt32.unpack(data) if uri is not None or server_idx is not None: return ua.ExpandedNodeId(identifier, nidx, nidtype, uri, server_idx) return ua.NodeId(identifier, nidx, nidtype)
def nodeid_from_binary(data): nid = ua.NodeId() encoding = ord(data.read(1)) nid.NodeIdType = ua.NodeIdType(encoding & 0b00111111) if nid.NodeIdType == ua.NodeIdType.TwoByte: nid.Identifier = ord(data.read(1)) elif nid.NodeIdType == ua.NodeIdType.FourByte: nid.NamespaceIndex, nid.Identifier = struct.unpack("<BH", data.read(3)) elif nid.NodeIdType == ua.NodeIdType.Numeric: nid.NamespaceIndex, nid.Identifier = struct.unpack("<HI", data.read(6)) elif nid.NodeIdType == ua.NodeIdType.String: nid.NamespaceIndex = Primitives.UInt16.unpack(data) nid.Identifier = Primitives.String.unpack(data) elif nid.NodeIdType == ua.NodeIdType.ByteString: nid.NamespaceIndex = Primitives.UInt16.unpack(data) nid.Identifier = Primitives.Bytes.unpack(data) elif nid.NodeIdType == ua.NodeIdType.Guid: nid.NamespaceIndex = Primitives.UInt16.unpack(data) nid.Identifier = Primitives.Guid.unpack(data) else: raise UaError(f'Unknown NodeId encoding: {nid.NodeIdType}') if test_bit(encoding, 7): nid.NamespaceUri = Primitives.String.unpack(data) if test_bit(encoding, 6): nid.ServerIndex = Primitives.UInt32.unpack(data) return nid