Files
libucore/src/hex.c
T
2014-09-12 01:11:40 +02:00

111 lines
2.1 KiB
C

#include <stdint.h>
#include <ctype.h>
#include <stddef.h>
#include <string.h>
#include "ucore/string.h"
#include "ucore/utils.h"
static const char hx_chars[] = "0123456789ABCDEF" ;
char*
uc_hex_encode(const uint8_t *restrict in, size_t len, char *restrict 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 *restrict in, size_t inlen, char *restrict out, int outlen, const char *restrict 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 *restrict in, size_t maxlen,uint8_t *restrict 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];
}