#!/usr/bin/gawk -f - # # Convert binary numbers to (hexa)decimal and (hexa)decimal to binary numbers. # Reads from stdin, precede binary numbers with a zero (0), precede hex # numbers with 0x. # The conversion algorithm is an awk adaptation of the Tcl code posted # to: http://wiki.tcl.tk/1591 by Lars Hellström. # BEGIN { s = "0 0o 1 0i 2 1o 3 1i 4 2o 5 2i 6 3o 7 3i 8 4o 9 4i"; d2b_im_len = split(s,d2b_im," "); s = "o0 ZRO o1 1 o2 2 o3 3 o4 4 i0 5 iZRO 5 i1 6 i2 7 i3 8 i4 9 0 X ZRO 0"; d2b_len = split(s,d2b," "); s = "0 oA 1 oB 2 oC 3 oD 4 oE 5 iA 6 iB 7 iC 8 iD 9 iE"; b2d_im_len = split(s,b2d_im," "); s = "Ao 0 Ai 1 Bo 2 Bi 3 Co 4 Ci 5 Do 6 Di 7 Eo 8 Ei 9 ho h hi h1"; b2d_len = split(s,b2d," "); } function smap(pat_a,len,s, i) { for (i=1; i <= len; i+=2) { gsub(pat_a[i],pat_a[i+1],s); } print "smap-> " s; return s; } function dec2bin(num) { while (num ~ /[0-9]/) { num=smap(d2b,d2b_len,smap(d2b_im,d2b_im_len,num)); } gsub(/i/,"1",num); gsub(/o/,"0",num); gsub(/X/,"",num); return num; } function bin2dec(num) { num = "h" num; gsub(/1/,"i",num); gsub(/0/,"o",num); while (num ~ /[io]/) { num=smap(b2d,b2d_len,smap(b2d_im,b2d_im_len,num)); } return substr(num,2); } /^0[01]+$/ { d = bin2dec($1); printf("0x%x %d\n", d, d); next; } /^0[xX]/ { print dec2bin(strtonum($1)); next; } /^[0-9]+$ { print dec2bin($1); }