17 const char cc = (char)std::tolower(c);
19 throw std::invalid_argument(
"invalid hex character");
25 throw std::invalid_argument(
"invalid hex character");
30 throw std::invalid_argument(
"invalid hex character");
33 static uint8_t chars_to_byte(
const char *cs)
35 const uint8_t *
data = (
const uint8_t *)cs;
39 static char nibble_hex(
const uint8_t nibble)
41 assert((nibble & 0xf0) == 0);
43 return (
char)(
'a' + nibble - 10);
46 return (
char)(
'0' + nibble);
51 static const char *find_hex_string_of_length(
52 const std::string &hex,
const size_t bytes)
54 if (
'0' == hex[0] &&
'x' == hex[1]) {
55 if (hex.size() != 2 +
bytes * 2) {
56 throw std::invalid_argument(
"invalid hex length");
58 return hex.c_str() + 2;
61 if (hex.size() !=
bytes * 2) {
62 throw std::invalid_argument(
"invalid hex length");
70 const char *cur = find_hex_string_of_length(hex,
bytes);
71 uint8_t *dest_bytes = (uint8_t *)dest;
72 const uint8_t *
const dest_bytes_end = dest_bytes +
bytes;
73 while (dest_bytes < dest_bytes_end) {
74 *dest_bytes = chars_to_byte(cur);
85 const char *cur = find_hex_string_of_length(hex,
bytes);
86 uint8_t *
const dest_bytes_end = (uint8_t *)dest;
87 uint8_t *dest_bytes = dest_bytes_end +
bytes;
90 *dest_bytes = chars_to_byte(cur);
92 }
while (dest_bytes > dest_bytes_end);
97 const size_t num_bytes = s.size() / 2;
98 assert(s.size() == 2 * num_bytes);
100 out.resize(num_bytes);
109 out.reserve(num_bytes * 2 + 2);
113 out.reserve(num_bytes * 2);
116 const uint8_t *in = (
const uint8_t *)
bytes;
117 for (
size_t i = 0; i < num_bytes; ++i) {
118 const uint8_t
byte = in[i];
119 out.push_back(nibble_hex(
byte >> 4));
120 out.push_back(nibble_hex(
byte & 0x0f));
127 const void *
bytes,
size_t num_bytes,
bool prefix)
129 if (num_bytes == 0) {
135 out.reserve(num_bytes * 2 + 2);
139 out.reserve(num_bytes * 2);
142 const uint8_t *
const src_bytes_end = (
const uint8_t *)
bytes;
143 const uint8_t *src_bytes = src_bytes_end + num_bytes;
146 const uint8_t
byte = *src_bytes;
147 out.push_back(nibble_hex(
byte >> 4));
148 out.push_back(nibble_hex(
byte & 0x0f));
149 }
while (src_bytes > src_bytes_end);