Changed: Centralize hexadecimal conversions

--HG--
branch : develop
This commit is contained in:
kervala 2017-12-02 16:44:38 +01:00
parent b00d62d4ce
commit 9e9b005b3b
4 changed files with 125 additions and 50 deletions

View file

@ -233,6 +233,26 @@ char toLower ( const char ch ); // convert only one character
std::string toUpper ( const std::string &str);
void toUpper ( char *str);
/**
* Convert to an hexadecimal std::string
*/
std::string toHexa(const uint8 &b);
std::string toHexa(const uint8 *data, uint size);
std::string toHexa(const std::string &str);
std::string toHexa(const char *str);
/**
* Convert from an hexadecimal std::string
*/
bool fromHexa(const std::string &hexa, uint8 &b);
bool fromHexa(const std::string &hexa, uint8 *data);
bool fromHexa(const std::string &hexa, std::string &str);
bool fromHexa(const char *hexa, uint8 &b);
bool fromHexa(const char *hexa, uint8 *data);
bool fromHexa(const char *hexa, std::string &str);
bool fromHexa(const char hexa, uint8 &b);
// Remove all the characters <= 32 (tab, space, new line, return, vertical tab etc..) at the beginning and at the end of a string
template <class T> T trim (const T &str)
{

View file

@ -662,6 +662,109 @@ void toUpper(char *str)
}
}
std::string toHexa(const uint8 &b)
{
return toString("%02hhx", b);
}
std::string toHexa(const uint8 *data, uint size)
{
std::string res;
// hexadecimal string will be always twice the original size
res.reserve(size * 2);
// process each byte
for (uint i = 0; i < size; ++i)
{
res += toHexa(data[i]);
}
return res;
}
std::string toHexa(const std::string &str)
{
return toHexa((uint8*)str.c_str(), (uint)str.length());
}
std::string toHexa(const char *str)
{
return toHexa((uint8*)str, (uint)strlen(str));
}
bool fromHexa(const std::string &hexa, uint8 &b)
{
return fromHexa(hexa.c_str(), b);
}
bool fromHexa(const std::string &hexa, uint8 *data)
{
return fromHexa(hexa.c_str(), data);
}
bool fromHexa(const std::string &hexa, std::string &str)
{
return fromHexa(hexa.c_str(), str);
}
bool fromHexa(const char *hexa, uint8 &b)
{
char c1 = *hexa;
char c2 = *(hexa+1);
uint8 x1, x2;
if (!fromHexa(c1, x1)) return false;
if (!fromHexa(c2, x2)) return false;
b = (x1 << 4) | x2;
return true;
}
bool fromHexa(const char *hexa, uint8 *data)
{
// length of the string
uint len = strlen(hexa);
// process each byte
for (uint i = 0; i < len; i += 2)
{
if (!fromHexa(hexa + i, *(data++))) return false;
}
return true;
}
bool fromHexa(const char *hexa, std::string &str)
{
str.resize(strlen(hexa) * 2);
return fromHexa(hexa, (uint8*)str.c_str());
}
bool fromHexa(const char hexa, uint8 &b)
{
if (hexa >= '0' && hexa <= '9')
{
b = hexa - '0';
return true;
}
if (hexa >= 'A' && hexa <= 'F')
{
b = hexa - 'A' + 10;
return true;
}
if (hexa >= 'a' && hexa <= 'f')
{
b = hexa - 'a' + 10;
return true;
}
return false;
}
std::string formatThousands(const std::string& s)
{
sint i, k;

View file

@ -118,31 +118,6 @@ CHashKeyMD5 getMD5(const uint8 *buffer, uint32 size)
return Message_Digest;
}
// ****************************************************************************
// Helper
// ****************************************************************************
static bool fromHex(char c, uint8 &x)
{
if (c >= '0' && c <= '9')
{
x = c - '0';
return true;
}
else if (c >= 'A' && c <= 'F')
{
x = c - 'A' + 10;
return true;
}
else if (c >= 'a' && c <= 'f')
{
x = c - 'a' + 10;
return true;
}
nlwarning("cannot convert to hexa");
return false;
}
// ****************************************************************************
// ****************************************************************************
// CHashKeyMD5
@ -159,10 +134,7 @@ void CHashKeyMD5::clear()
// ****************************************************************************
string CHashKeyMD5::toString() const
{
string sTmp;
for (uint32 i = 0; i < 16; ++i)
sTmp += NLMISC::toString("%02x", Data[i]);
return sTmp;
return toHexa(Data, 16);
}
// ****************************************************************************
@ -174,16 +146,7 @@ bool CHashKeyMD5::fromString(const std::string &in)
return false;
}
for (uint32 i = 0; i < 16; ++i)
{
char c1 = in[2*i];
char c2 = in[2*i+1];
uint8 x1, x2;
if (!fromHex(c1, x1)) return false;
if (!fromHex(c2, x2)) return false;
Data[i] = (x1 << 4) | x2;
}
return true;
return fromHexa(in, Data);
}
// ****************************************************************************

View file

@ -560,17 +560,6 @@ inline CLFECOMMON::TCoord getAbsoluteCoordinateFrom64( uint64 posvalue )
}*/
inline std::string toHexaString(const std::vector<uint8> &v)
{
std::string res;
for (uint i = 0; i < v.size(); i++)
{
res += NLMISC::toString("%x",v[i]);
}
return res;
}
#endif // NL_ENTITY_TYPES_H
/* End of entity_types.h */