diff --git a/src/hex.cpp b/src/hex.cpp index 3e94368..9ce8feb 100644 --- a/src/hex.cpp +++ b/src/hex.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -37,14 +38,12 @@ namespace hex void encode(const uint8_t *data, uint64_t data_size, char *str) noexcept { std::string_view sv(str); - for(size_t i = 0; i < sv.size() && i / 2 < data_size; i++) + std::span dv(data, data_size); + + for (size_t i = 0; i < dv.size() && i * 2 + 1 < sv.size(); i++) { - if (i % 2 == 0) - { - str[i] = hexdigits[data[i / 2] >> 4]; - } else { - str[i] = hexdigits[data[i / 2] & 0x0F]; - } + str[i * 2] = hexdigits[dv[i] >> 4]; + str[i * 2 + 1] = hexdigits[dv[i] & 0x0F]; } } std::string encode(const std::vector &data) noexcept @@ -60,13 +59,15 @@ namespace hex throw std::logic_error("hex::decode: out of digits map"); } std::string_view sv(str); + std::span dv(data, data_size); if (sv.size() % 2 != 0) { throw std::logic_error("hex::decode: isn't hex"); } - for (size_t i = 0; i < data_size && i * 2 < sv.size(); i++) + + for (size_t i = 0; i < dv.size() && i * 2 < sv.size(); i++) { - data[i] = hexmap[(int8_t)str[i * 2]] << 4 | hexmap[(int8_t)str[i * 2 + 1]]; + data[i] = hexmap[(int8_t)sv[i * 2]] << 4 | hexmap[(int8_t)sv[i * 2 + 1]]; } } std::vector decode(const std::string &str)