throw std::range_error("odd number of bytes in hex string");
}
string ret;
- ret.reserve(in.size());
+ ret.reserve(in.size() / 2);
+
unsigned int num;
- for (size_t i = 0; i < in.size(); i+=2) {
- string numStr = in.substr(i, 2);
+ for (size_t i = 0; i < in.size(); i += 2) {
+ const auto numStr = in.substr(i, 2);
num = 0;
- sscanf(numStr.c_str(), "%02x", &num);
- ret.push_back((uint8_t)num);
+ if (sscanf(numStr.c_str(), "%02x", &num) != 1) {
+ throw std::range_error("Invalid value while parsing the hex string '" + in + "'");
+ }
+ ret.push_back(static_cast<uint8_t>(num));
}
+
return ret;
}
BOOST_CHECK_EQUAL(out, "\x12\x34\x56\x78\x90\xab\xcd\xef");
BOOST_CHECK_THROW(makeBytesFromHex("123"), std::range_error);
+
+ BOOST_CHECK_THROW(makeBytesFromHex("1234GG"), std::range_error);
}
BOOST_AUTO_TEST_SUITE_END()