diff --git a/SRPXX-Tests/String.cpp b/SRPXX-Tests/String.cpp index 7a6025d..fe0ca84 100644 --- a/SRPXX-Tests/String.cpp +++ b/SRPXX-Tests/String.cpp @@ -43,6 +43,16 @@ XSTest( String, ToUpper ) XSTestAssertTrue( SRP::String::toUpper( "a1b2" ) == "A1B2" ); } +XSTest( String, ToHex ) +{ + XSTestAssertTrue( SRP::String::toHex( {}, SRP::String::HexFormat::Uppercase ) == "" ); + XSTestAssertTrue( SRP::String::toHex( {}, SRP::String::HexFormat::Lowercase ) == "" ); + XSTestAssertTrue( SRP::String::toHex( { 0x42 }, SRP::String::HexFormat::Uppercase ) == "42" ); + XSTestAssertTrue( SRP::String::toHex( { 0x42 }, SRP::String::HexFormat::Lowercase ) == "42" ); + XSTestAssertTrue( SRP::String::toHex( { 0x42, 0xFF }, SRP::String::HexFormat::Uppercase ) == "42FF" ); + XSTestAssertTrue( SRP::String::toHex( { 0x42, 0xFF }, SRP::String::HexFormat::Lowercase ) == "42ff" ); +} + XSTest( String, HasPrefix ) { XSTestAssertTrue( SRP::String::hasPrefix( "abcd", "a" ) ); diff --git a/SRPXX/include/SRPXX/String.hpp b/SRPXX/include/SRPXX/String.hpp index 44c4ba2..e4ce8f6 100644 --- a/SRPXX/include/SRPXX/String.hpp +++ b/SRPXX/include/SRPXX/String.hpp @@ -26,13 +26,22 @@ #define SRPXX_STRING_HPP #include +#include +#include namespace SRP { namespace String { + enum class HexFormat + { + Uppercase, + Lowercase + }; + std::string toLower( const std::string & str ); std::string toUpper( const std::string & str ); + std::string toHex( const std::vector< uint8_t > & data, HexFormat format = HexFormat::Uppercase ); bool hasPrefix( const std::string & str, const std::string & prefix ); } diff --git a/SRPXX/source/String.cpp b/SRPXX/source/String.cpp index 3d45abb..0c137aa 100644 --- a/SRPXX/source/String.cpp +++ b/SRPXX/source/String.cpp @@ -46,6 +46,29 @@ namespace SRP return ret; } + std::string toHex( const std::vector< uint8_t > & data, HexFormat format ) + { + std::string s; + + for( uint8_t b: data ) + { + char c[ 3 ]; + + if( format == HexFormat::Uppercase ) + { + std::snprintf( c, 3, "%02X", b ); + } + else + { + std::snprintf( c, 3, "%02x", b ); + } + + s.append( c ); + } + + return s; + } + bool hasPrefix( const std::string & str, const std::string & prefix ) { if( str.length() < prefix.length() )