[core] Add constexpr parse_hex_char helper and simplify parse_hex (#12394)

This commit is contained in:
J. Nick Koston
2025-12-10 04:20:08 +01:00
committed by GitHub
parent d0fbc82f47
commit b1f9100b02
2 changed files with 14 additions and 10 deletions

View File

@@ -266,19 +266,12 @@ std::string make_name_with_suffix(const std::string &name, char sep, const char
// Parsing & formatting
size_t parse_hex(const char *str, size_t length, uint8_t *data, size_t count) {
uint8_t val;
size_t chars = std::min(length, 2 * count);
for (size_t i = 2 * count - chars; i < 2 * count; i++, str++) {
if (*str >= '0' && *str <= '9') {
val = *str - '0';
} else if (*str >= 'A' && *str <= 'F') {
val = 10 + (*str - 'A');
} else if (*str >= 'a' && *str <= 'f') {
val = 10 + (*str - 'a');
} else {
uint8_t val = parse_hex_char(*str);
if (val > 15)
return 0;
}
data[i >> 1] = !(i & 1) ? val << 4 : data[i >> 1] | val;
data[i >> 1] = (i & 1) ? data[i >> 1] | val : val << 4;
}
return chars;
}

View File

@@ -624,6 +624,17 @@ template<typename T, enable_if_t<std::is_unsigned<T>::value, int> = 0> optional<
return parse_hex<T>(str.c_str(), str.length());
}
/// Parse a hex character to its nibble value (0-15), returns 255 on invalid input
constexpr uint8_t parse_hex_char(char c) {
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
return 255;
}
/// Convert a nibble (0-15) to lowercase hex char
inline char format_hex_char(uint8_t v) { return v >= 10 ? 'a' + (v - 10) : '0' + v; }