Merge pull request #4850
b36353e2
unit_tests: add some hex parsing test for non hex input (xiphon)6671110c
unit_tests: add a test for parse_hexstr_to_binbuff (moneromooo-monero)f6187cd8
epee: speed up parse_hexstr_to_binbuff a little (Howard Chu)
This commit is contained in:
commit
40650b43b8
|
@ -59,6 +59,26 @@
|
|||
#pragma comment (lib, "Rpcrt4.lib")
|
||||
#endif
|
||||
|
||||
static const constexpr unsigned char isx[256] =
|
||||
{
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 10, 11, 12, 13, 14, 15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 10, 11, 12, 13, 14, 15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
};
|
||||
|
||||
namespace epee
|
||||
{
|
||||
namespace string_tools
|
||||
|
@ -98,30 +118,30 @@ namespace string_tools
|
|||
}
|
||||
//----------------------------------------------------------------------------
|
||||
template<class CharT>
|
||||
bool parse_hexstr_to_binbuff(const std::basic_string<CharT>& s, std::basic_string<CharT>& res, bool allow_partial_byte = false)
|
||||
bool parse_hexstr_to_binbuff(const std::basic_string<CharT>& s, std::basic_string<CharT>& res)
|
||||
{
|
||||
res.clear();
|
||||
if (!allow_partial_byte && (s.size() & 1))
|
||||
if (s.size() & 1)
|
||||
return false;
|
||||
try
|
||||
{
|
||||
long v = 0;
|
||||
for(size_t i = 0; i < (s.size() + 1) / 2; i++)
|
||||
res.resize(s.size() / 2);
|
||||
unsigned char *dst = (unsigned char *)res.data();
|
||||
const unsigned char *src = (const unsigned char *)s.data();
|
||||
for(size_t i = 0; i < s.size(); i += 2)
|
||||
{
|
||||
CharT byte_str[3];
|
||||
size_t copied = s.copy(byte_str, 2, 2 * i);
|
||||
byte_str[copied] = CharT(0);
|
||||
CharT* endptr;
|
||||
v = strtoul(byte_str, &endptr, 16);
|
||||
if (v < 0 || 0xFF < v || endptr != byte_str + copied)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
res.push_back(static_cast<unsigned char>(v));
|
||||
int tmp = *src++;
|
||||
tmp = isx[tmp];
|
||||
if (tmp == 0xff) return false;
|
||||
int t2 = *src++;
|
||||
t2 = isx[t2];
|
||||
if (t2 == 0xff) return false;
|
||||
*dst++ = (tmp << 4) | t2;
|
||||
}
|
||||
|
||||
return true;
|
||||
}catch(...)
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -456,6 +456,35 @@ TEST(StringTools, PodToHex)
|
|||
);
|
||||
}
|
||||
|
||||
TEST(StringTools, ParseHex)
|
||||
{
|
||||
static const char data[] = "a10b68c2";
|
||||
for (size_t i = 0; i < sizeof(data); i += 2)
|
||||
{
|
||||
std::string res;
|
||||
ASSERT_TRUE(epee::string_tools::parse_hexstr_to_binbuff(std::string(data, i), res));
|
||||
std::string hex = epee::string_tools::buff_to_hex_nodelimer(res);
|
||||
ASSERT_EQ(hex.size(), i);
|
||||
ASSERT_EQ(memcmp(data, hex.data(), i), 0);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(StringTools, ParseNotHex)
|
||||
{
|
||||
std::string res;
|
||||
for (size_t i = 0; i < 256; ++i)
|
||||
{
|
||||
std::string inputHexString = std::string(2, static_cast<char>(i));
|
||||
if ((i >= '0' && i <= '9') || (i >= 'A' && i <= 'F') || (i >= 'a' && i <= 'f')) {
|
||||
ASSERT_TRUE(epee::string_tools::parse_hexstr_to_binbuff(inputHexString, res));
|
||||
} else {
|
||||
ASSERT_FALSE(epee::string_tools::parse_hexstr_to_binbuff(inputHexString, res));
|
||||
}
|
||||
}
|
||||
|
||||
ASSERT_FALSE(epee::string_tools::parse_hexstr_to_binbuff(std::string("a"), res));
|
||||
}
|
||||
|
||||
TEST(StringTools, GetIpString)
|
||||
{
|
||||
EXPECT_EQ(
|
||||
|
|
Loading…
Reference in New Issue