32 int fromHexChar(
char _i) noexcept
34 if (_i >=
'0' && _i <=
'9')
36 if (_i >=
'a' && _i <=
'f')
38 if (_i >=
'A' && _i <=
'F')
47 if (_s.compare(0, 2,
"0x") == 0)
49 return std::all_of(it, _s.end(), [](
char c){ return fromHexChar(c) != -1; });
54 static const map<char, char> prettyEscapes{{
'\r',
'r'}, {
'\n',
'n'}, {
'\t',
't'}, {
'\v',
'v'}};
56 ret.reserve(_s.size() + 2);
59 if (i ==
'"' && !_all)
61 else if (i ==
'\\' && !_all)
63 else if (prettyEscapes.count(i) && !_all)
66 ret += prettyEscapes.find(i)->second;
68 else if (i <
' ' || _all)
71 ret.push_back(
"0123456789abcdef"[(uint8_t)i / 16]);
72 ret.push_back(
"0123456789abcdef"[(uint8_t)i % 16]);
83 unsigned s = (_s.size() >= 2 && _s[0] ==
'0' && _s[1] ==
'x') ? 2 : 0;
84 std::vector<uint8_t> ret;
85 ret.reserve((_s.size() - s + 1) / 2);
89 int h = fromHexChar(_s[s++]);
92 else if (_throw == WhenError::Throw)
93 BOOST_THROW_EXCEPTION(BadHexCharacter());
97 for (
unsigned i = s; i < _s.size(); i += 2)
99 int h = fromHexChar(_s[i]);
100 int l = fromHexChar(_s[i + 1]);
101 if (h != -1 && l != -1)
102 ret.push_back((
byte)(h * 16 + l));
103 else if (_throw == WhenError::Throw)
104 BOOST_THROW_EXCEPTION(BadHexCharacter());
113 std::vector<uint8_t> ret;
114 ret.reserve(_s.
size() * 2);
117 ret.push_back(i / 16);
118 ret.push_back(i % 16);