From 3bcc713fb39438afa65802880ccad1e8e25bed32 Mon Sep 17 00:00:00 2001 From: Gerd von Egidy Date: Mon, 18 Jul 2016 14:11:43 +0200 Subject: [PATCH] add functions to convert from hex strings to other types --- src/stringfunc.hxx | 41 ++++++++++++++++++++++++++++++++++++++++- test/stringfunc.cpp | 10 +++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/stringfunc.hxx b/src/stringfunc.hxx index 407b726..7f108a4 100644 --- a/src/stringfunc.hxx +++ b/src/stringfunc.hxx @@ -137,7 +137,6 @@ std::string convert_binary_to_hex(const std::string&str, bool upper_case_digits= std::string convert_hex_to_binary(const std::string& str) throw(std::runtime_error); - /* ** "type conversions": */ @@ -182,6 +181,46 @@ bool string_to(const std::string& s, T& result) /** + * convert string in hexadecimal notation to a datatype @a T + * supports strings with and without "0x" notation, e.g. 0xff and FF are both valid + * + * @param s the hex string which should be converted to @a T. + * @return the value of type T. + */ +template< +class T +> +T hex_string_to(const std::string& s) +{ + std::istringstream istr(s); + T result; + istr >> std::hex >> result; + return result; +} // eo string_to(const std::string&) + + +/** + * convert string in hexadecimal notation to a datatype @a T + * supports strings with and without "0x" notation, e.g. 0xff and FF are both valid + * + * @param s the hex string which should be converted to @a T. + * @param result the resulting value of type @a T. + * @return @a true iff the internal string stream was EOF after the conversion. + * + * @attention: does not return if the conversion was successful. So check for empty strings before. + */ +template< +class T +> +bool hex_string_to(const std::string& s, T& result) +{ + std::istringstream istr(s); + istr >> std::hex >> result; + return istr.eof(); +} // eo string_to(const std::string&) + + +/** * convert a string to another datatype @a T via string stream. * * @param v the value (of type @a T) which should be converted to a string. diff --git a/test/stringfunc.cpp b/test/stringfunc.cpp index 8ced76b..49e44e0 100644 --- a/test/stringfunc.cpp +++ b/test/stringfunc.cpp @@ -34,6 +34,7 @@ on this file might be covered by the GNU General Public License. #include #include +#include using namespace std; using namespace I2n; @@ -646,7 +647,7 @@ BOOST_AUTO_TEST_CASE(ConversionStringInt) -BOOST_AUTO_TEST_CASE(HexConversion) +BOOST_AUTO_TEST_CASE(HexBinaryConversion) { std::string hex1("49324E"); std::string bin1("I2N"); @@ -668,6 +669,13 @@ BOOST_AUTO_TEST_CASE(HexConversion) BOOST_REQUIRE_THROW( convert_hex_to_binary("01 kein hex"), std::runtime_error); } // eo HexConversion() +BOOST_AUTO_TEST_CASE(HexIntConversion) +{ + BOOST_CHECK_EQUAL( 255 , hex_string_to("ff") ); + BOOST_CHECK_EQUAL( 18866985 , hex_string_to("11FE329") ); + BOOST_CHECK_EQUAL( 44 , hex_string_to("0x2C") ); +} + BOOST_AUTO_TEST_CASE(sanitize_for_logging1) { string output = sanitize_for_logging("normaler string ohne aerger"); -- 1.7.1