in extensions/opc/src/opc.cpp [458:541]
std::string nodeValue2String(const NodeData& nd) {
std::string ret_val;
switch (nd.dataTypeID) {
case UA_DATATYPEKIND_STRING:
case UA_DATATYPEKIND_LOCALIZEDTEXT:
case UA_DATATYPEKIND_BYTESTRING: {
UA_String value = *reinterpret_cast<UA_String *>(nd.var_->data);
ret_val = std::string(reinterpret_cast<const char *>(value.data), value.length);
break;
}
case UA_DATATYPEKIND_BOOLEAN:
bool b;
memcpy(&b, nd.data.data(), sizeof(bool));
ret_val = b ? "True" : "False";
break;
case UA_DATATYPEKIND_SBYTE:
int8_t i8t;
memcpy(&i8t, nd.data.data(), sizeof(i8t));
ret_val = std::to_string(i8t);
break;
case UA_DATATYPEKIND_BYTE:
uint8_t ui8t;
memcpy(&ui8t, nd.data.data(), sizeof(ui8t));
ret_val = std::to_string(ui8t);
break;
case UA_DATATYPEKIND_INT16:
int16_t i16t;
memcpy(&i16t, nd.data.data(), sizeof(i16t));
ret_val = std::to_string(i16t);
break;
case UA_DATATYPEKIND_UINT16:
uint16_t ui16t;
memcpy(&ui16t, nd.data.data(), sizeof(ui16t));
ret_val = std::to_string(ui16t);
break;
case UA_DATATYPEKIND_INT32:
int32_t i32t;
memcpy(&i32t, nd.data.data(), sizeof(i32t));
ret_val = std::to_string(i32t);
break;
case UA_DATATYPEKIND_UINT32:
uint32_t ui32t;
memcpy(&ui32t, nd.data.data(), sizeof(ui32t));
ret_val = std::to_string(ui32t);
break;
case UA_DATATYPEKIND_INT64:
int64_t i64t;
memcpy(&i64t, nd.data.data(), sizeof(i64t));
ret_val = std::to_string(i64t);
break;
case UA_DATATYPEKIND_UINT64:
uint64_t ui64t;
memcpy(&ui64t, nd.data.data(), sizeof(ui64t));
ret_val = std::to_string(ui64t);
break;
case UA_DATATYPEKIND_FLOAT:
if (sizeof(float) == 4 && std::numeric_limits<float>::is_iec559) {
float f;
memcpy(&f, nd.data.data(), sizeof(float));
ret_val = std::to_string(f);
} else {
throw OPCException(GENERAL_EXCEPTION, "Float is non-standard on this system, OPC data cannot be extracted!");
}
break;
case UA_DATATYPEKIND_DOUBLE:
if (sizeof(double) == 8 && std::numeric_limits<double>::is_iec559) {
double d;
memcpy(&d, nd.data.data(), sizeof(double));
ret_val = std::to_string(d);
} else {
throw OPCException(GENERAL_EXCEPTION, "Double is non-standard on this system, OPC data cannot be extracted!");
}
break;
case UA_DATATYPEKIND_DATETIME: {
UA_DateTime dt;
memcpy(&dt, nd.data.data(), sizeof(UA_DateTime));
ret_val = opc::OPCDateTime2String(dt);
break;
}
default:
throw OPCException(GENERAL_EXCEPTION, "Data type is not supported ");
}
return ret_val;
}