#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#define b2i(c) (c == '1' ? 1 : 0)
#define I(c) c - '0'
char table[2][2][2][2] = {
'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'
};
char *bin2hex(const char *binstr){
size_t len = strlen(binstr);
size_t r = len % 4;//len & 3
size_t add_len = (4 - r) % 4;
len += add_len;
char *bin = malloc(len + 1);
strncpy(bin, "0000", add_len);//Normalization
strcpy(bin + add_len, binstr);
size_t hex_len = len / 4;// len >> 2;
char *hexstr = malloc(hex_len + 1);
size_t b, h;
for(h=b=0;b<len; b+=4){
hexstr[h++] = table[I(bin[b])][I(bin[b+1])][I(bin[b+2])][I(bin[b+3])];
}
hexstr[h] = '\0';
free(bin);
return hexstr;
}
int main(void){
const char *bin = "10001100110100010101100111000000";
char *hex = bin2hex(bin);
printf("%s\n", hex);//8CD159C0
free(hex);
return 0;
}