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);