std::string nodeValue2String()

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;
}