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; | |
| } |