14#ifndef OPENVPN_COMMON_HEXSTR_H
15#define OPENVPN_COMMON_HEXSTR_H
47 return '0' +
static_cast<char>(c);
49 return static_cast<char>((caps ?
'A' :
'a') - 10 + c);
67 if (c >=
'0' && c <=
'9')
69 else if (c >=
'a' && c <=
'f')
71 else if (c >=
'A' && c <=
'F')
135inline std::string
render_hex(
const unsigned char *data,
size_t size,
const bool caps =
false)
140 ret.reserve(size * 2 + 1);
161inline std::string
render_hex(
const void *data,
const size_t size,
const bool caps =
false)
163 return render_hex((
const unsigned char *)data, size, caps);
180inline std::string
render_hex_sep(
const unsigned char *data,
size_t size,
const char sep,
const bool caps =
false)
185 ret.reserve(size * 3);
212inline std::string
render_hex_sep(
const void *data,
const size_t size,
const char sep,
const bool caps =
false)
214 return render_hex_sep((
const unsigned char *)data, size, sep, caps);
233 ret.reserve(data.size() * 2 + 1);
234 for (
size_t i = 0; i < data.size(); ++i)
255inline std::string
dump_hex(
const unsigned char *data,
size_t size)
259 const unsigned int mask = 0x0F;
260 std::ostringstream os;
264 for (i = 0; i < size; ++i)
270 os <<
" " << chars << std::endl;
273 os << std::setfill(
' ') << std::setw(8) << i <<
":";
275 const unsigned char c = data[i];
276 os <<
' ' << std::setfill(
'0') << std::setw(2) << (
unsigned int)c;
283 os << string::spaces(clamp_to_typerange<int>(2 + (((i - 1) & mask) ^ mask) * 3)) << chars << std::endl;
298inline std::string
dump_hex(
void *data,
size_t size)
300 return dump_hex((
const unsigned char *)data, size);
315 return dump_hex((
const unsigned char *)str.c_str(), str.length());
332 return dump_hex(data.c_data(), data.size());
354 using vvalue_t =
typename V::value_type;
355 const int len = int(str.length());
357 for (i = 0; i <= len - 2; i += 2)
361 if (high == -1 || low == -1)
362 throw parse_hex_error();
363 dest.push_back(
static_cast<vvalue_t
>((high << 4) + low));
366 throw parse_hex_error();
391 const char c = str[i++];
443 if (!parse_hex_number<T>(str.c_str(),
ret))
444 throw parse_hex_error();
463 unsigned char buf[
sizeof(T)];
464 for (
size_t i =
sizeof(T); i-- > 0;)
466 buf[i] = value & 0xFF;
487 return std::string(b.
str2(), 2);
const char * str2() const
RenderHexByte(const unsigned char byte, const bool caps=false)
#define OPENVPN_SIMPLE_EXCEPTION(C)
bool is_printable(const char c)
Support deferred server-side state creation when client connects.
std::string render_hex_generic(const V &data, const bool caps=false)
bool parse_hex_number(const char *str, T &retval)
void parse_hex(V &dest, const std::string &str)
int parse_hex_char(const int c)
std::string render_hex(const unsigned char *data, size_t size, const bool caps=false)
char render_hex_char(const int c, const bool caps=false)
std::string render_hex_number(T value, const bool caps=false)
std::string render_hex_sep(const unsigned char *data, size_t size, const char sep, const bool caps=false)
std::string dump_hex(const unsigned char *data, size_t size)