in extensions/opc/src/opc.cpp [483:577]
std::string nodeValue2String(const NodeData& nd) {
std::string ret_val;
switch (nd.data_type_id) {
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 = false;
memcpy(&b, nd.data.data(), sizeof(bool));
ret_val = b ? "True" : "False";
break;
}
case UA_DATATYPEKIND_SBYTE: {
int8_t i8t = 0;
memcpy(&i8t, nd.data.data(), sizeof(i8t));
ret_val = std::to_string(i8t);
break;
}
case UA_DATATYPEKIND_BYTE: {
uint8_t ui8t = 0;
memcpy(&ui8t, nd.data.data(), sizeof(ui8t));
ret_val = std::to_string(ui8t);
break;
}
case UA_DATATYPEKIND_INT16: {
int16_t i16t = 0;
memcpy(&i16t, nd.data.data(), sizeof(i16t));
ret_val = std::to_string(i16t);
break;
}
case UA_DATATYPEKIND_UINT16: {
uint16_t ui16t = 0;
memcpy(&ui16t, nd.data.data(), sizeof(ui16t));
ret_val = std::to_string(ui16t);
break;
}
case UA_DATATYPEKIND_INT32: {
int32_t i32t = 0;
memcpy(&i32t, nd.data.data(), sizeof(i32t));
ret_val = std::to_string(i32t);
break;
}
case UA_DATATYPEKIND_UINT32: {
uint32_t ui32t = 0;
memcpy(&ui32t, nd.data.data(), sizeof(ui32t));
ret_val = std::to_string(ui32t);
break;
}
case UA_DATATYPEKIND_INT64: {
int64_t i64t = 0;
memcpy(&i64t, nd.data.data(), sizeof(i64t));
ret_val = std::to_string(i64t);
break;
}
case UA_DATATYPEKIND_UINT64: {
uint64_t ui64t = 0;
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 = 0;
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 = 0;
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 = 0;
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;
}