api
size_t bin2hex(const unsigned char *bin, size_t blen, unsigned char **hexout)
size_t hex2bin(const unsigned char *old, unsigned char **str)
/************************************************************************* | |
> File Name: hex.c | |
> Author: jige003 | |
> Created Time: Thu 25 Apr 2019 02:08:49 PM CST | |
************************************************************************/ | |
#include <stdio.h> | |
#include <string.h> | |
#include <stdlib.h> | |
#include <assert.h> | |
#define P printf | |
size_t hexchr2bin(const char hex, char *out){ | |
if (out == NULL) | |
return 0; | |
if (hex >= '0' && hex <= '9') { | |
*out = hex - '0'; | |
} else if (hex >= 'A' && hex <= 'F') { | |
*out = hex - 'A' + 10; | |
} else if (hex >= 'a' && hex <= 'f') { | |
*out = hex - 'a' + 10; | |
} else { | |
return 0; | |
} | |
return 1; | |
} | |
size_t hexs2bin(const char *hex, unsigned char **out){ | |
size_t len; | |
char b1; | |
char b2; | |
size_t i; | |
if (hex == NULL || *hex == '\0' || out == NULL) | |
return 0; | |
len = strlen(hex); | |
if (len % 2 != 0) | |
return 0; | |
len /= 2; | |
*out = (unsigned char *)malloc(len); | |
memset(*out, 'A', len); | |
for (i=0; i<len; i++) { | |
if (!hexchr2bin(hex[i*2], &b1) || !hexchr2bin(hex[i*2+1], &b2)) { | |
return 0; | |
} | |
(*out)[i] = (b1 << 4) | b2; | |
} | |
return len; | |
} | |
size_t bin2hex(const unsigned char *bin, size_t blen, unsigned char **hexout){ | |
if (bin == NULL || blen == 0) return -1; | |
*hexout = (unsigned char *)malloc(blen * 2); | |
unsigned char *hex = *hexout; | |
size_t i; | |
for (i=0; i < blen; ++i) { | |
hex[i*2] = "0123456789ABCDEF"[bin[i] >> 4]; | |
hex[i*2+1] = "0123456789ABCDEF"[bin[i] & 0x0F]; | |
} | |
hex[blen*2] = '\0'; | |
return blen*2; | |
} | |
size_t hex2bin(const unsigned char *old, unsigned char **str){ | |
size_t target_length = strlen(old) >> 1; | |
*str = (unsigned char *) malloc(target_length); | |
unsigned char *ret = *str; | |
size_t i, j; | |
for (i = j = 0; i < target_length; i++) { | |
unsigned char c = old[j++]; | |
unsigned char d; | |
if (c >= '0' && c <= '9') { | |
d = (c - '0') << 4; | |
} else if (c >= 'a' && c <= 'f') { | |
d = (c - 'a' + 10) << 4; | |
} else if (c >= 'A' && c <= 'F') { | |
d = (c - 'A' + 10) << 4; | |
} else { | |
free(str); | |
return -1; | |
} | |
c = old[j++]; | |
if (c >= '0' && c <= '9') { | |
d |= c - '0'; | |
} else if (c >= 'a' && c <= 'f') { | |
d |= c - 'a' + 10; | |
} else if (c >= 'A' && c <= 'F') { | |
d |= c - 'A' + 10; | |
} else { | |
free(str); | |
return -1; | |
} | |
ret[i] = d; | |
} | |
ret[i] = '\0'; | |
return i; | |
} | |
int main(){ | |
/* test bin 2 hex */ | |
unsigned char bindata[] = "this is a test str by jige003"; | |
unsigned char *hexdata; | |
int hlen; | |
hlen = bin2hex(bindata, strlen(bindata), &hexdata); | |
P("hexdata: %s\n", hexdata); | |
/* test hex to bin */ | |
unsigned char *origdata; | |
int blen; | |
blen = hex2bin(hexdata, &origdata); | |
P("orig data:%s\n", origdata); | |
assert( strcmp(bindata, origdata) == 0 ); | |
return 0; | |
} |