#include <stdlib.h> #include <stdio.h> #include <string.h> #include <stdint.h> #include <errno.h> const char HEX_DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; static inline int to_nibble(char *bin) { char *endptr = NULL; char *dup = strndup(bin, 4); int result = strtol(dup, &endptr, 2); if (dup + strlen(dup) != endptr) { free(dup); return -1; } free(dup); return result; } char *pad_to_n(char *str, size_t n) { size_t len = (strlen(str) / n + 1) * n; char *out = calloc(len + 1, sizeof(char)); char *ptr = out; for (size_t i = 0; i < len - strlen(str); i++) { *ptr = '0'; ptr++; } while (*str) { *ptr = *str; ptr++; str++; } return out; } char *bin_to_hex(char *num) { char *padded = pad_to_n(num, 8); char *ptr = padded; char *end = padded + strlen(padded); char *out = calloc(strlen(padded) / 4 + 1, sizeof(char)); size_t i = 0; while (ptr < end) { int num = to_nibble(ptr); if (num == -1) { free(padded); free(out); return NULL; } out[i] = HEX_DIGITS[num]; ptr += 4; i++; } free(padded); return out; }