diff options
| -rw-r--r-- | include/misc.h | 4 | ||||
| -rw-r--r-- | misc.cc | 26 | 
2 files changed, 29 insertions, 1 deletions
| diff --git a/include/misc.h b/include/misc.h index cccd830..5fcd16d 100644 --- a/include/misc.h +++ b/include/misc.h @@ -2,6 +2,7 @@  #define MISC_H  #include <stdio.h>  #include <string> +#include <vector>  namespace nitrokey {  namespace misc { @@ -16,7 +17,8 @@ typename T::CommandPayload get_payload(){      std::string hexdump(const char *p, size_t size, bool print_header=true); -uint32_t stm_crc32(const uint8_t *data, size_t size); +    uint32_t stm_crc32(const uint8_t *data, size_t size); +    std::vector<uint8_t> hex_string_to_byte(const char* hexString);  }  } @@ -2,10 +2,36 @@  #include <string>  #include "misc.h"  #include "inttypes.h" +#include <cstdlib> +#include <cstring> +#include <cassert>  namespace nitrokey {  namespace misc { +std::vector<uint8_t> hex_string_to_byte(const char* hexString){ +    const size_t s_size = strlen(hexString); +    const size_t d_size = (s_size+1)/2; // add 1 for odd, ignore for even +    assert(s_size%2==0); +    assert(s_size<256); //arbitrary 'big' number +    auto data = std::vector<uint8_t>(d_size, 0); + +    char buf[2]; +    for(int i=0; i<s_size; i++){ + +        char c = hexString[i]; +        bool char_from_range = ('0' <= c && c <='9' || 'A' <= c && c <= 'F' || 'a' <= c && c<= 'f'); +        if (!char_from_range){ +            return {}; +        } +        buf[i%2] = c; +        if (i%2==1){ +            data[i/2] = strtoul(buf, NULL, 16) & 0xFF; +        } +    } +    return data; +}; +  std::string hexdump(const char *p, size_t size, bool print_header) {    std::stringstream out;    char formatbuf[128]; | 
