function base32tohex (str) { var base32chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; var padding = "="; var bits = ""; var length = str.length - 8; if(length < 0) { length = str.length; } for(var i = 0; i < length; i++) { var val = base32chars.indexOf(str[i]); bits += ("00000" + val.toString(2)).slice(-5); } if(length < str.length) { var lastblock = str.substr(length); var lastblocklength; var lastblocknumberofbits; if (lastblock[2] === padding) { lastblocklength = 2; lastblocknumberofbits = 8; } else if (lastblock[4] === padding) { lastblocklength = 4; lastblocknumberofbits = 16; } else if (lastblock[5] === padding) { lastblocklength = 5; lastblocknumberofbits = 24; } else if (lastblock[7] === padding) { lastblocklength = 7; lastblocknumberofbits = 32; } else { lastblocklength = 8; lastblocknumberofbits = 40; } for(i = length; i < length + lastblocklength; i++) { var lastblockval = base32chars.indexOf(str[i]); bits += ("00000" + lastblockval.toString(2)).slice(-5).substring(0, lastblocknumberofbits); lastblocknumberofbits -= 5; } } var hex = ""; for( i = 0; i + 4 <= bits.length; i+=4) { var chunk = bits.substr(i, 4); hex += parseInt(chunk, 2).toString(16) ; } return hex; }