TE
TechEcho
Home
24h Top
Newest
Best
Ask
Show
Jobs
English
GitHub
Twitter
Home
Binary to hex faster than xxd, part 2 of 2
3 points
by
textmode
about 4 years ago
<p><pre><code> static int hexdigit(char x) { if (x >= '0' && x <= '9') return x - '0'; if (x >= 'a' && x <= 'f') return 10 + (x - 'a'); if (x >= 'A' && x <= 'F') return 10 + (x - 'A'); return -1; } int hexparse(unsigned char *y,long long len,const char *x) { if (!x) return 0; while (len > 0) { int digit0; int digit1; digit0 = hexdigit(x[0]); if (digit0 == -1) return 0; digit1 = hexdigit(x[1]); if (digit1 == -1) return 0; *y++ = digit1 + 16 * digit0; --len; x += 2; } if (x[0]) return 0; return 1; } char buf[256]; long long buflen = 0; static void flush(void) { if (writeall(1, buf, buflen) == -1) _exit(errno); buflen = 0; } static void xeet(void) { flush(); if (fsyncfd(1) == -1) _exit(errno); _exit(0); } static void wrch(const char ch) { if (buflen >= sizeof buf) flush(); buf[buflen++] = ch; return; } char inbuf[128]; int main(int argc, char **argv) { long long r, i; for (;;) { r = read(0, inbuf, sizeof inbuf); if (r == -1) _exit(errno); if (r == 0) break; for (i = 0; i < r; ++i) { wrch("0123456789abcdef"[15 & (inbuf[i] >> 4)]); wrch("0123456789abcdef"[15 & inbuf[i]]); } } wrch('\n'); xeet(); return 0; }</code></pre>
1 comment
textmode
almost 4 years ago
<p><pre><code> static void flush(void) { if (writeall(1, buf, buflen) == -1) _exit(errno); buflen = 0; } static void wrch(const char ch) { if (buflen >= sizeof buf) flush(); buf[buflen++] = ch; return; } char inbuf[128]; int main(int argc, char **argv) { long long r, i; for (;;) { r = read(0, inbuf, sizeof inbuf); if (r == -1) _exit(errno); if (r == 0) break; for (i = 0; i < r; ++i) { wrch("0123456789abcdef"[15 & (inbuf[i] >> 4)]); wrch("0123456789abcdef"[15 & inbuf[i]]); } } wrch('\n'); return 0; }</code></pre>