# 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));
    }
}