From ca509a8b97ff46b6cbd3c371784ac5e582a52c99 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 25 Jan 2025 15:27:42 +1000 Subject: [PATCH] StringUtil: Add fixed-length DecodeHex() --- src/common/string_util.cpp | 29 +++++++++++++++++++++-------- src/common/string_util.h | 1 + 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp index 6275d4281..3fd9dea62 100644 --- a/src/common/string_util.cpp +++ b/src/common/string_util.cpp @@ -165,21 +165,34 @@ u8 StringUtil::DecodeHexDigit(char ch) return 0; } -std::optional> StringUtil::DecodeHex(const std::string_view in) +size_t StringUtil::DecodeHex(std::span dest, const std::string_view str) { - std::vector data; - data.reserve(in.size() / 2); + if ((str.length() % 2) != 0) + return 0; - for (size_t i = 0; i < in.size() / 2; i++) + const size_t bytes = str.length() / 2; + if (dest.size() != bytes) + return 0; + + for (size_t i = 0; i < bytes; i++) { - std::optional byte = StringUtil::FromChars(in.substr(i * 2, 2), 16); + std::optional byte = StringUtil::FromChars(str.substr(i * 2, 2), 16); if (byte.has_value()) - data.push_back(*byte); + dest[i] = byte.value(); else - return std::nullopt; + return i; } - return {data}; + return bytes; +} + +std::optional> StringUtil::DecodeHex(const std::string_view in) +{ + std::optional> ret; + ret = std::vector(in.size() / 2); + if (DecodeHex(ret.value(), in) != ret->size()) + ret.reset(); + return ret; } std::string StringUtil::EncodeHex(const void* data, size_t length) diff --git a/src/common/string_util.h b/src/common/string_util.h index d5803a643..744cba9e2 100644 --- a/src/common/string_util.h +++ b/src/common/string_util.h @@ -242,6 +242,7 @@ static inline bool IsWhitespace(char ch) /// Encode/decode hexadecimal byte buffers u8 DecodeHexDigit(char ch); +size_t DecodeHex(std::span dest, const std::string_view str); std::optional> DecodeHex(const std::string_view str); std::string EncodeHex(const void* data, size_t length); template