]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Add function to make a bytestring from hex
authorPieter Lexis <pieter.lexis@powerdns.com>
Tue, 6 Apr 2021 21:44:51 +0000 (23:44 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Mon, 20 Sep 2021 08:52:59 +0000 (10:52 +0200)
pdns/misc.cc
pdns/misc.hh
pdns/test-misc_hh.cc

index ad3a2f450682c8c768d99eb8ba4ca5223ebae3a5..494e49849f4577b6846440b40c268d6e0461c3d5 100644 (file)
@@ -577,6 +577,21 @@ string makeHexDump(const string& str)
   return ret;
 }
 
+string makeBytesFromHex(const string &in) {
+  if (in.size() % 2 != 0) {
+    throw std::range_error("odd number of bytes in hex string");
+  }
+  string ret;
+  unsigned int num;
+  for (size_t i = 0; i < in.size(); i+=2) {
+    string numStr = in.substr(i, 2);
+    num = 0;
+    sscanf(numStr.c_str(), "%02x", &num);
+    ret.push_back((uint8_t)num);
+  }
+  return ret;
+}
+
 void normalizeTV(struct timeval& tv)
 {
   if(tv.tv_usec > 1000000) {
index 6307293f55cb91bd934da9192e6d003ee4d39c3b..d2a1ac2767491409fd334a5b3da01b8e6f09cd6f 100644 (file)
@@ -304,6 +304,8 @@ inline void unixDie(const string &why)
 }
 
 string makeHexDump(const string& str);
+//! Convert the hexstring in to a byte string
+string makeBytesFromHex(const string &in);
 
 void normalizeTV(struct timeval& tv);
 const struct timeval operator+(const struct timeval& lhs, const struct timeval& rhs);
index bc10168df2fda6ac42fecf4ded1071a7f97e3ce3..0f591bcfd7fa3c3a71bf0767fc11c97e86de49cc 100644 (file)
@@ -391,4 +391,11 @@ BOOST_AUTO_TEST_CASE(test_parseSVCBValueList)
   BOOST_CHECK_EQUAL(out[0], "foobar123 blabla bla,baz quux456");
 }
 
+BOOST_AUTO_TEST_CASE(test_makeBytesFromHex) {
+  string out = makeBytesFromHex("1234567890abcdef");
+  BOOST_CHECK_EQUAL(out, "\x12\x34\x56\x78\x90\xab\xcd\xef");
+
+  BOOST_CHECK_THROW(makeBytesFromHex("123"), std::range_error);
+}
+
 BOOST_AUTO_TEST_SUITE_END()