lib: Add utility function to convert from hex to binary
This commit is contained in:
parent
767f3d37ec
commit
a9b30951ce
|
@ -35,6 +35,42 @@
|
|||
namespace barrier {
|
||||
namespace string {
|
||||
|
||||
namespace {
|
||||
|
||||
// returns negative in case of non-matching character
|
||||
int hex_to_number(char ch)
|
||||
{
|
||||
switch (ch) {
|
||||
case '0': return 0;
|
||||
case '1': return 1;
|
||||
case '2': return 2;
|
||||
case '3': return 3;
|
||||
case '4': return 4;
|
||||
case '5': return 5;
|
||||
case '6': return 6;
|
||||
case '7': return 7;
|
||||
case '8': return 8;
|
||||
case '9': return 9;
|
||||
|
||||
case 'a': return 10;
|
||||
case 'b': return 11;
|
||||
case 'c': return 12;
|
||||
case 'd': return 13;
|
||||
case 'e': return 14;
|
||||
case 'f': return 15;
|
||||
|
||||
case 'A': return 10;
|
||||
case 'B': return 11;
|
||||
case 'C': return 12;
|
||||
case 'D': return 13;
|
||||
case 'E': return 14;
|
||||
case 'F': return 15;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
std::string
|
||||
format(const char* fmt, ...)
|
||||
{
|
||||
|
@ -196,6 +232,26 @@ std::string to_hex(const std::string& subject, int width, const char fill)
|
|||
return ss.str();
|
||||
}
|
||||
|
||||
std::vector<std::uint8_t> from_hex(const std::string& data)
|
||||
{
|
||||
if ((data.size() % 2) != 0) {
|
||||
return {};
|
||||
}
|
||||
|
||||
std::vector<std::uint8_t> result;
|
||||
result.reserve(data.size() / 2);
|
||||
|
||||
for (std::size_t i = 0; i < data.size(); i += 2) {
|
||||
auto high = hex_to_number(data[i]);
|
||||
auto low = hex_to_number(data[i + 1]);
|
||||
if (high < 0 || low < 0) {
|
||||
return {};
|
||||
}
|
||||
result.push_back(high * 16 + low);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
uppercase(std::string& subject)
|
||||
{
|
||||
|
|
|
@ -77,6 +77,9 @@ Convert each character in \c subject into hexdecimal form with \c width
|
|||
*/
|
||||
std::string to_hex(const std::string& subject, int width, const char fill = '0');
|
||||
|
||||
/// Convert binary data from hexadecimal
|
||||
std::vector<std::uint8_t> from_hex(const std::string& data);
|
||||
|
||||
//! Convert to all uppercase
|
||||
/*!
|
||||
Convert each character in \c subject to uppercase
|
||||
|
|
|
@ -62,6 +62,20 @@ TEST(StringTests, toHex_plaintext_hexString)
|
|||
EXPECT_EQ("666f6f626172", string::to_hex(subject, width));
|
||||
}
|
||||
|
||||
TEST(StringTests, fromhex_plaintext_string)
|
||||
{
|
||||
auto result = string::from_hex("666f6f626172");
|
||||
std::string expected = "foobar";
|
||||
EXPECT_EQ(result, std::vector<std::uint8_t>(expected.begin(), expected.end()));
|
||||
}
|
||||
|
||||
TEST(StringTests, fromhex_binary_string)
|
||||
{
|
||||
auto result = string::from_hex("01020304050600fff9");
|
||||
auto expected = std::vector<std::uint8_t>{1, 2, 3, 4, 5, 6, 0, 0xff, 0xf9};
|
||||
EXPECT_EQ(result, expected);
|
||||
}
|
||||
|
||||
TEST(StringTests, uppercase_lowercaseInput_uppercaseOutput)
|
||||
{
|
||||
String subject = "12foo3BaR";
|
||||
|
|
Loading…
Reference in New Issue