TE
TechEcho
Home24h TopNewestBestAskShowJobs
GitHubTwitter
Home

TechEcho

A tech news platform built with Next.js, providing global tech news and discussions.

GitHubTwitter

Home

HomeNewestBestAskShowJobs

Resources

HackerNews APIOriginal HackerNewsNext.js

© 2025 TechEcho. All rights reserved.

Binary to hex faster than xxd, part 2 of 2

3 pointsby textmodeabout 4 years ago
<p><pre><code> static int hexdigit(char x) { if (x &gt;= &#x27;0&#x27; &amp;&amp; x &lt;= &#x27;9&#x27;) return x - &#x27;0&#x27;; if (x &gt;= &#x27;a&#x27; &amp;&amp; x &lt;= &#x27;f&#x27;) return 10 + (x - &#x27;a&#x27;); if (x &gt;= &#x27;A&#x27; &amp;&amp; x &lt;= &#x27;F&#x27;) return 10 + (x - &#x27;A&#x27;); return -1; } int hexparse(unsigned char *y,long long len,const char *x) { if (!x) return 0; while (len &gt; 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 &gt;= 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 &lt; r; ++i) { wrch(&quot;0123456789abcdef&quot;[15 &amp; (inbuf[i] &gt;&gt; 4)]); wrch(&quot;0123456789abcdef&quot;[15 &amp; inbuf[i]]); } } wrch(&#x27;\n&#x27;); xeet(); return 0; }</code></pre>

1 comment

textmodealmost 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 &gt;= 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 &lt; r; ++i) { wrch(&quot;0123456789abcdef&quot;[15 &amp; (inbuf[i] &gt;&gt; 4)]); wrch(&quot;0123456789abcdef&quot;[15 &amp; inbuf[i]]); } } wrch(&#x27;\n&#x27;); return 0; }</code></pre>