[tor-commits] [vidalia/alpha] Add base16_decode implementation based on tor's

chiiph at torproject.org chiiph at torproject.org
Thu Jul 5 00:13:45 UTC 2012


commit 528205043ebc7cbb001c647cd3dcc1377e648647
Author: Tomás Touceda <chiiph at torproject.org>
Date:   Wed Jul 4 21:09:56 2012 -0300

    Add base16_decode implementation based on tor's
---
 src/common/stringutil.cpp |   47 +++++++++++++++++++++++++++++++++++++++++++++
 src/common/stringutil.h   |    1 +
 2 files changed, 48 insertions(+), 0 deletions(-)

diff --git a/src/common/stringutil.cpp b/src/common/stringutil.cpp
index 8b9b64d..9ce9dbd 100644
--- a/src/common/stringutil.cpp
+++ b/src/common/stringutil.cpp
@@ -122,6 +122,53 @@ base16_encode(const QByteArray &buf)
   return hex;
 }
 
+/** Helper: given a hex digit, return its value, or -1 if it isn't hex. */
+inline int
+_hex_decode_digit(char c)
+{
+  switch (c) {
+    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': case 'a': return 10;
+    case 'B': case 'b': return 11;
+    case 'C': case 'c': return 12;
+    case 'D': case 'd': return 13;
+    case 'E': case 'e': return 14;
+    case 'F': case 'f': return 15;
+    default:
+      return -1;
+  }
+}
+
+/** Given a hexadecimal string of <b>srclen</b> bytes in <b>src</b>, decode it
+ * and store the result in the <b>destlen</b>-byte buffer at <b>dest</b>.
+ * Return 0 on success, -1 on failure. */
+QString
+base16_decode(const QByteArray &buf)
+{
+  int v1,v2;
+  QString dest;
+
+  if ((buf.size() % 2) != 0)
+    return QString();
+  for(int i = 0; i < buf.size(); i+=2) {
+    v1 = _hex_decode_digit(buf[i]);
+    v2 = _hex_decode_digit(buf[i+1]);
+    if (v1<0||v2<0)
+      return QString();
+    dest.append((v1<<4)|v2);
+  }
+  return dest;
+}
+
 /** Given an ASCII string <b>str</b>, this function returns a quoted string
  * with all escaped characters unescaped. Non-ASCII characters in the string
  * will be converted to the local 8-bit character encoding and encoded using
diff --git a/src/common/stringutil.h b/src/common/stringutil.h
index 24cac74..0e2f9fe 100644
--- a/src/common/stringutil.h
+++ b/src/common/stringutil.h
@@ -47,6 +47,7 @@ QString string_wrap(const QString &str, int width,
  * returns the result. This function is derived from base16_encode() in Tor's
  * util.c. See LICENSE for details on Tor's license. */
 QString base16_encode(const QByteArray &buf);
+QString base16_decode(const QByteArray &buf);
 
 /** Given a string <b>str</b>, this function returns a quoted string with all
  * '"' and '\' characters escaped with a single '\'. */





More information about the tor-commits mailing list