2015-05-11 00:18:22 +02:00
|
|
|
#include "util.h"
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
template <>
|
|
|
|
int getJson(const Json::Value &root, const string &key)
|
|
|
|
{
|
|
|
|
auto val = root.get(key, Json::Value());
|
|
|
|
if (val.isInt())
|
|
|
|
return val.asInt();
|
2015-09-25 00:13:30 +02:00
|
|
|
throw std::runtime_error("Json Type error");
|
2015-05-11 00:18:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <>
|
|
|
|
string getJson(const Json::Value &root, const string &key)
|
|
|
|
{
|
|
|
|
auto val = root.get(key, Json::Value());
|
|
|
|
if (val.isString())
|
|
|
|
return val.asString();
|
2015-09-25 00:13:30 +02:00
|
|
|
throw std::runtime_error("Json Type error");
|
2015-05-11 00:18:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <>
|
|
|
|
size_t getJson(const Json::Value &root, const string &key)
|
|
|
|
{
|
|
|
|
auto val = root.get(key, Json::Value());
|
|
|
|
if (val.isInt())
|
|
|
|
return val.asUInt64();
|
2015-09-25 00:13:30 +02:00
|
|
|
throw std::runtime_error("Json Type error");
|
2015-05-11 00:18:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <>
|
|
|
|
bool getJson(const Json::Value &root, const string &key)
|
|
|
|
{
|
|
|
|
auto val = root.get(key, Json::Value());
|
|
|
|
if (val.isBool())
|
|
|
|
return val.asBool();
|
2015-09-25 00:13:30 +02:00
|
|
|
throw std::runtime_error("Json Type error");
|
2015-05-11 00:18:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
template <>
|
|
|
|
Json::Value getJson(const Json::Value &root, const string &key)
|
|
|
|
{
|
|
|
|
auto val = root.get(key, Json::Value());
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char nibble2hex(unsigned char input)
|
|
|
|
{
|
|
|
|
input &= 0xf;
|
|
|
|
|
|
|
|
if(input <= 9)
|
|
|
|
{
|
|
|
|
return input + '0';
|
|
|
|
}
|
|
|
|
|
|
|
|
return input - 0xA + 'A';
|
|
|
|
}
|
|
|
|
|
|
|
|
string toHexString(const uint64_t c)
|
|
|
|
{
|
|
|
|
string retval;
|
|
|
|
|
|
|
|
retval = nibble2hex((c>>60) & 0xF);
|
|
|
|
retval += nibble2hex((c>>56) & 0xF);
|
|
|
|
retval += nibble2hex((c>>52) & 0xF);
|
|
|
|
retval += nibble2hex((c>>48) & 0xF);
|
|
|
|
retval += nibble2hex((c>>44) & 0xF);
|
|
|
|
retval += nibble2hex((c>>40) & 0xF);
|
|
|
|
retval += nibble2hex((c>>36) & 0xF);
|
|
|
|
retval += nibble2hex((c>>32) & 0xF);
|
|
|
|
retval += nibble2hex((c>>28) & 0xF);
|
|
|
|
retval += nibble2hex((c>>24) & 0xF);
|
|
|
|
retval += nibble2hex((c>>20) & 0xF);
|
|
|
|
retval += nibble2hex((c>>16) & 0xF);
|
|
|
|
retval += nibble2hex((c>>12) & 0xF);
|
|
|
|
retval += nibble2hex((c>> 8) & 0xF);
|
|
|
|
retval += nibble2hex((c>> 4) & 0xF);
|
|
|
|
retval += nibble2hex((c ) & 0xF);
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned char hex2uchar(const char input)
|
|
|
|
{
|
|
|
|
if(input >= '0' && input <= '9') {
|
|
|
|
return input - '0';
|
|
|
|
} else if(input >= 'A' && input <= 'F') {
|
|
|
|
return input - 'A' + 10;
|
|
|
|
} else if(input >= 'a' && input <= 'f') {
|
|
|
|
return input - 'a' + 10;
|
|
|
|
}
|
2015-09-25 00:13:30 +02:00
|
|
|
throw std::runtime_error("Malformed hexadecimal input");
|
2015-05-11 00:18:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t toUint64(const string &s)
|
|
|
|
{
|
|
|
|
if (s.length() != (64/4))
|
|
|
|
{
|
2015-09-25 00:13:30 +02:00
|
|
|
throw std::runtime_error("Hex string has invalid length");
|
2015-05-11 00:18:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t retval = 0;
|
|
|
|
|
|
|
|
for (int i = 0 ; i < (64/4) ; i++)
|
|
|
|
{
|
|
|
|
retval <<= 4;
|
|
|
|
retval |= hex2uchar(s.at(i))&0xf;
|
|
|
|
}
|
|
|
|
|
|
|
|
return retval;
|
|
|
|
}
|