add hex conv
This commit is contained in:
parent
2b20c2d2a4
commit
fa0a09df87
@ -3,6 +3,9 @@ cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
|
|||||||
project(solanaceae)
|
project(solanaceae)
|
||||||
|
|
||||||
add_library(solanaceae_util
|
add_library(solanaceae_util
|
||||||
|
./solanaceae/util/utils.hpp
|
||||||
|
./solanaceae/util/utils.cpp
|
||||||
|
|
||||||
./solanaceae/util/config_model.hpp
|
./solanaceae/util/config_model.hpp
|
||||||
./solanaceae/util/config_model.inl
|
./solanaceae/util/config_model.inl
|
||||||
|
|
||||||
|
53
solanaceae/util/utils.cpp
Normal file
53
solanaceae/util/utils.cpp
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#include "./utils.hpp"
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
constexpr uint8_t nib_from_hex(char c) {
|
||||||
|
assert((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'));
|
||||||
|
|
||||||
|
if (c >= '0' && c <= '9') {
|
||||||
|
return static_cast<uint8_t>(c) - '0';
|
||||||
|
} else if (c >= 'a' && c <= 'f') {
|
||||||
|
return (static_cast<uint8_t>(c) - 'a') + 10u;
|
||||||
|
} else {
|
||||||
|
return 0u;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr char nib_to_hex(uint8_t c) {
|
||||||
|
assert(c <= 0x0f);
|
||||||
|
|
||||||
|
if (c <= 0x09) {
|
||||||
|
return c + '0';
|
||||||
|
} else {
|
||||||
|
return (c - 10u) + 'a';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // detail
|
||||||
|
|
||||||
|
std::vector<uint8_t> hex2bin(const std::string& str) {
|
||||||
|
return hex2bin(std::string_view{str});
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<uint8_t> hex2bin(const std::string_view str) {
|
||||||
|
assert(str.size() % 2 == 0); // TODO: should this be a hard assert??
|
||||||
|
std::vector<uint8_t> bin{};
|
||||||
|
bin.resize(str.size()/2, 0);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < bin.size(); i++) {
|
||||||
|
bin[i] = detail::nib_from_hex(str[i*2]) << 4 | detail::nib_from_hex(str[i*2+1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bin;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string bin2hex(const std::vector<uint8_t>& data) {
|
||||||
|
std::string str;
|
||||||
|
for (size_t i = 0; i < data.size(); i++) {
|
||||||
|
str.push_back(detail::nib_to_hex(data[i] >> 4));
|
||||||
|
str.push_back(detail::nib_to_hex(data[i] & 0x0f));
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
10
solanaceae/util/utils.hpp
Normal file
10
solanaceae/util/utils.hpp
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
[[nodiscard]] std::vector<uint8_t> hex2bin(const std::string& str);
|
||||||
|
[[nodiscard]] std::vector<uint8_t> hex2bin(const std::string_view str);
|
||||||
|
[[nodiscard]] std::string bin2hex(const std::vector<uint8_t>& bin);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user