#!/usr/bin/awk -f # ########################################################################################## # # AWK script to encode argument to BASE64 # # (C) March 6, 2003, Peter van Eerten # Revised for standard AWK at October 18,2005 # This code is released under the well-known GPL license. # # With GNU Awk, run as follows: # gawk --traditional -f b64enc.awk # ########################################################################################## # Function to return ASCII value of character function asc(char, l_found) { for (i = 32; i < 127; i++){ if (sprintf("%c", i) == char) l_found = i; } return l_found } # Bitwise AND between 2 variables - var AND x function and(var, x, l_res, l_i) { l_res=0; for (l_i=0; l_i < 8; l_i++){ if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; else l_res/=2; var=int(var/2); x=int(x/2); } return l_res; } # Rotate bytevalue left x times function lshift(var, x) { while(x > 0){ var*=2; x--; } return var; } # Rotate bytevalue right x times function rshift(var, x) { while(x > 0){ var=int(var/2); x--; } return var; } # Main program BEGIN { if (ARGC < 2) { print "\nEncode an ASCII string to BASE64."; print "\nUsage: b64enc.awk \n"; print "Examples:" print "---------" print "b64enc.awk Sometext" print "b64enc.awk \"This is the text\"\n" exit; } else ARGC = 1; BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" result = "" while (length(ARGV[1]) > 0){ # Specify byte values if (length(ARGV[1]) == 1){ byte1 = asc(substr(ARGV[1], 1, 1)) byte2 = 0 byte3 = 0 } if (length(ARGV[1]) == 2){ byte1 = asc(substr(ARGV[1], 1, 1)) byte2 = asc(substr(ARGV[1], 2, 1)) byte3 = 0 } if (length(ARGV[1]) >= 3){ byte1 = asc(substr(ARGV[1], 1, 1)) byte2 = asc(substr(ARGV[1], 2, 1)) byte3 = asc(substr(ARGV[1], 3, 1)) } # Create BASE64 values base1 = rshift(byte1, 2) base2 = lshift(and(byte1, 3), 4) + rshift(and(byte2, 240), 4) base3 = lshift(and(byte2, 15), 2) + rshift(and(byte3, 192), 6) base4 = and(byte3, 63) # Compose BASE64 string if (length(ARGV[1]) == 1){ result = result substr(BASE64, base1 + 1, 1) result = result substr(BASE64, base2 + 1, 1) result = result "==" ARGV[1] = "" } if (length(ARGV[1]) == 2){ result = result substr(BASE64, base1 + 1, 1) result = result substr(BASE64, base2 + 1, 1) result = result substr(BASE64, base3 + 1, 1) result = result "=" ARGV[1] = "" } if (length(ARGV[1]) >= 3){ result = result substr(BASE64, base1 + 1, 1) result = result substr(BASE64, base2 + 1, 1) result = result substr(BASE64, base3 + 1, 1) result = result substr(BASE64, base4 + 1, 1) ARGV[1] = substr(ARGV[1], 4) } } print "\nBase64 encoded: " result print }