diff --git a/foundations/ability/utils/include/string_utils.h b/foundations/ability/utils/include/string_utils.h index a29aa53a0ac01633f84a93cff5e921f157bd4d06..5c22f79cd1dbbecd258d5e293dd6b847815b19d1 100644 --- a/foundations/ability/utils/include/string_utils.h +++ b/foundations/ability/utils/include/string_utils.h @@ -17,6 +17,7 @@ #define STRING_UTILS_H #include +#include #include #include #include @@ -25,6 +26,15 @@ namespace OHOS { namespace UpdateEngine { + +enum class StrCnvResult { + SUCCESS, + FAILED, + INVALID_CHAR, + NUMBER_FORMAT_ERROR, + SPILL_OVER, +}; + class StringUtils { public: // trim from start (in place) @@ -129,6 +139,38 @@ public: } return; } + + template [[maybe_unused]] static StrCnvResult DecStringToNumber(const std::string &str, T &number) + { + constexpr int numberBase = 10; + return StringToNumberInner(str, number, numberBase); + } + +private: + template + [[maybe_unused]] static StrCnvResult StringToNumberInner(const std::string &str, T &number, int base) + { + T numTemp; + std::string strTemp = str; + Trim(strTemp); + auto result = std::from_chars(strTemp.data(), strTemp.data() + strTemp.size(), numTemp, base); + if (result.ec == std::errc::result_out_of_range) { + return StrCnvResult::SPILL_OVER; + } + if (result.ec != std::errc()) { + return StrCnvResult::FAILED; + } + number = numTemp; + // 判断字符串是否含有特殊字符 例如"100a" + if (result.ptr != strTemp.data() + strTemp.size()) { + return StrCnvResult::INVALID_CHAR; + } + // 防止字符串前后空格导致解析错误,使得数据可以解析,是否使用由调用者自己判断 + if (strTemp.size() != str.size()) { + return StrCnvResult::NUMBER_FORMAT_ERROR; + } + return StrCnvResult::SUCCESS; + } }; } // namespace UpdateEngine } // namespace OHOS diff --git a/services/firmware/upgrade/mode/src/firmware_download_mode.cpp b/services/firmware/upgrade/mode/src/firmware_download_mode.cpp index 316904711cc348816b50f9a40e32507d076609d5..d6ad9947745b7f88f8c0e738f534d36f91b75905 100644 --- a/services/firmware/upgrade/mode/src/firmware_download_mode.cpp +++ b/services/firmware/upgrade/mode/src/firmware_download_mode.cpp @@ -26,6 +26,7 @@ #include "firmware_status_cache.h" #include "firmware_task_operator.h" #include "firmware_update_helper.h" +#include "string_utils.h" namespace OHOS { namespace UpdateEngine { @@ -102,7 +103,7 @@ FirmwareStep FirmwareDownloadMode::GetStepAfterDownload() } ErrorMessage errorMessage; if (!downloadDataProcessor_.GetDownloadProgress().endReason.empty()) { - errorMessage.errorCode = stoi(downloadDataProcessor_.GetDownloadProgress().endReason); + StringUtils::DecStringToNumber(downloadDataProcessor_.GetDownloadProgress().endReason, errorMessage.errorCode); } FirmwareStep nextStep = FirmwareStep::COMPLETE; switch (task.status) {