#include #include #include #include #include "ucore/string.h" #include "ucore/utils.h" static const char hx_chars[] = "0123456789ABCDEF" ; char* uc_hex_encode(const uint8_t *in, size_t len, char *out) { unsigned int i, t; for (i = 0, t = 0; i < len; ++i,t+=2) { unsigned int hn, ln; hn = (in[i] & 0xF0) >> 4 ; ln = in[i] & 0x0F ; out[t] = hx_chars[hn]; out[t+1] = hx_chars[ln]; } out[t] = 0; return out; } char* uc_hex_encode_delim(const uint8_t *in, size_t inlen, char *out, int outlen, const char *delim) { size_t i; char *outp = out; for (i = 0; i < inlen; i++) { unsigned int hn, ln; const char *delimp = delim; /** Truncate at a full byte */ if (outlen <= 2) { break; } hn = (in[i] & 0xF0) >> 4 ; ln = in[i] & 0x0F ; outp[0] = hx_chars[hn]; outp[1] = hx_chars[ln]; outlen -= 2; outp += 2; while (outlen > 1 && *delimp) { *outp++ = *delimp++; outlen--; } } *outp = 0; return outp; } /* ASCII only */ static inline int char_to_bin(char c) { if (c >='0' && c <='9') return c - '0'; else if (c >= 'A' && c <= 'F') return c - 'A' + 10; else if (c >= 'a' && c <= 'f') return c - 'a' + 10; return -1; } uint8_t* uc_hex_decode(const char *in, size_t maxlen,uint8_t *out) { size_t i, t; for (t = 0,i = 0; i + 1 < maxlen ;) { int hn, ln; if (!(in[i] && in[i + 1])) { break; } if (in[i] == ' ' || in[i] == '\t' || in[i] == '\r' || in[i] == '\n') { i++; continue; } hn = char_to_bin(in[i]); ln = char_to_bin(in[i + 1]); if (hn == -1 || ln == -1) return NULL; out[t] = (hn << 4 ) | ln; i += 2; t++; } return &out[t]; }