#include #include #include int fromhex(char c) { if (c >= '0' && c <= '9') return c - '0'; else if (c >= 'A' && c <= 'F') return c - 'A' + 10; else return c - 'a' + 10; } void asciify(const char *s) { char result[strlen(s)+1]; int r = 0; if (s[0] == '0' && toupper(s[1]) == 'X') { s += 2; } else { // fixme base 10 } char prev = 0; if (strlen(s) % 2 == 1) prev = '0'; // synthesize leading zero for ( ; *s; s++) { if (!prev) { prev = *s; } else if (!isxdigit(*s)) { prev = 0; } else { // printf("%c%c %x %x\n", prev, *s, fromhex(prev), fromhex(*s)); int num = fromhex(prev)*16 + fromhex(*s); result[r++] = isgraph(num) ? num : ' '; prev = 0; } } result[r++] = '\0'; printf("###%s###\n", result); printf("###"); while (r--) { printf("%c", result[r]); } printf("###\n"); } int main(int argc, char **argv) { for (int i = 1; i < argc; i++) { asciify(argv[i]); } }