From 556ac27991e4810d3b37ff3e2e27e7ee43a49121 Mon Sep 17 00:00:00 2001 From: "Robin P. Clark" Date: Sun, 9 Oct 2022 11:48:20 +0100 Subject: [PATCH] binary numbers not so trival in gawk --- binary_numbers.awk | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 binary_numbers.awk diff --git a/binary_numbers.awk b/binary_numbers.awk new file mode 100644 index 0000000..c351945 --- /dev/null +++ b/binary_numbers.awk @@ -0,0 +1,60 @@ +# gawk binary number functions +# RPC 09OCT2022 + +# convert an 8 bit binary number to an integer +function bin_to_n(i) +{ + n = 0; + #printf(">> %s:", i); + for (k = 1; k < 9; k++) { + n = n * 2; + b = substr(i, k, 1); + if (b == "1") { + n = n + 1; + } + } + return (n); +} + +# convert a number to a binary number +function dectobin(n) +{ + printf("dectobin: n in %d ",n); + binstring = "0b"; # some c compilers allow 0bXXXXXXXX format numbers + bn = 128; + for(k=0;k<8;k++) { + if (n >= bn) { + binstring = binstring "1"; + n = n - bn; + } else { + binstring = binstring "0" + } + printf(" bn %d",bn); + bn = bn / 2; + } + return binstring; +} + +BEGIN { + FS = " "; + + # gawk (I think) has no atoi() funciton or equiv. So a table of all + # chars (well 256 ascii) can be used with the index function to get + # round this + for (i = 0; i < 255; i++) { + table = sprintf("%s%c", table, i); + } +} + +{ + # assume on stdin a buffer of 8 bit binary numbers "01000001 01000010" is AB etc + for (i = 1; i <= NF; i++) + printf("bin-num#%d: %x --> %c\n", i, bin_to_n($i), bin_to_n($i)); + + s = "ABC123string to test"; + for (i = 0; i < length(s); i++) { + nn = index(table, substr(s,i+1,1))-1; + printf("substr :%s:%x:",ss,nn); + printf(" :%d: %s\n", i, dectobin(nn)); + } +}