From 9f90f31291c64088f5baedcda4e03759a448ce53 Mon Sep 17 00:00:00 2001
From: Toon Stegen <tstegen@nalys-group.com>
Date: Wed, 1 Aug 2018 18:09:41 +0200
Subject: [PATCH] sys/fmt: add function for converting hex byte

---
 sys/fmt/fmt.c     |  7 ++++++-
 sys/include/fmt.h | 11 +++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/sys/fmt/fmt.c b/sys/fmt/fmt.c
index 5ea21e8b8e..0c7fa2c7f5 100644
--- a/sys/fmt/fmt.c
+++ b/sys/fmt/fmt.c
@@ -132,6 +132,11 @@ static uint8_t _hex_nib(uint8_t nib)
     return _byte_mod25((nib & 0x1f) + 9);
 }
 
+uint8_t fmt_hex_byte(const char *hex)
+{
+    return (_hex_nib(hex[0]) << 4) | _hex_nib(hex[1]);
+}
+
 size_t fmt_hex_bytes(uint8_t *out, const char *hex)
 {
     size_t len = fmt_strlen(hex);
@@ -143,7 +148,7 @@ size_t fmt_hex_bytes(uint8_t *out, const char *hex)
 
     size_t final_len = len >> 1;
     for (size_t i = 0, j = 0; j < final_len; i += 2, j++) {
-        out[j] = (_hex_nib(hex[i]) << 4) | _hex_nib(hex[i+1]);
+        out[j] = fmt_hex_byte(hex + i);
     }
 
     return final_len;
diff --git a/sys/include/fmt.h b/sys/include/fmt.h
index 229f939611..7176494d30 100644
--- a/sys/include/fmt.h
+++ b/sys/include/fmt.h
@@ -91,6 +91,17 @@ size_t fmt_bytes_hex(char *out, const uint8_t *ptr, size_t n);
  */
 size_t fmt_bytes_hex_reverse(char *out, const uint8_t *ptr, size_t n);
 
+/**
+ * @brief Converts a sequence of two hex characters to a byte
+ *
+ * The hex characters sequence must contain valid hexadecimal characters
+ * otherwise the result is undefined.
+ *
+ * @param[in]  hex  Pointer to input buffer
+ * @returns    byte based on hex string
+ */
+uint8_t fmt_hex_byte(const char *hex);
+
 /**
  * @brief Converts a sequence of hex bytes to an array of bytes
  *
-- 
GitLab