Omair .
Omair .

Reputation: 344

Javascript fails to give correct output in IE

    <script>
// This would be the place to edit if you want a different
// Base32 implementation

var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345'


/**
 * Build a lookup table and memoize it
 *
 * Return an object that maps a character to its
 * byte value.
 */

var lookup = function() {
    var table = {}
    // Invert 'alphabet'
    for (var i = 0; i < alphabet.length; i++) {
        table[alphabet[i]] = i
    }

    lookup = function() { return table }
    return table
}


// Functions analogously to Encoder

function Decoder() {
    var skip = 0 // how many bits we have from the previous character
    var byte = 0 // current byte we're producing

    this.output = ''

    // Consume a character from the stream, store
    // the output in this.output. As before, better
    // to use update().
    this.readChar = function(char) {
        if (typeof char != 'string'){
            if (typeof char == 'number') {
                char = String.fromCharCode(char)
            }
        }
        //char = char.toLowerCase()
        var val = lookup()[char]
        if (typeof val == 'undefined') {
            // character does not exist in our lookup table
            return // skip silently. An alternative would be:
            // throw Error('Could not find character "' + char + '" in lookup table.')
        }
        val <<= 3 // move to the high bits
        byte |= val >>> skip
        skip += 5
        if (skip >= 8) {
            // we have enough to preduce output
            this.output += String.fromCharCode(byte)
            skip -= 8
            if (skip > 0) byte = (val << (5 - skip)) & 255
            else byte = 0
        }

    }

    this.finish = function(check) {
        var output = this.output + (skip < 0 ? alphabet[bits >> 3] : '') + (check ? '$' : '')
        this.output = ''
        return output
    }
}

Decoder.prototype.update = function(input, flush) {
    for (var i = 0; i < input.length; i++) {
        this.readChar(input[i])
    }
    var output = this.output
    this.output = ''
    if (flush) {
      output += this.finish()
    }
    return output
}

/** Convenience functions
 *
 * These are the ones to use if you just have a string and
 * want to convert it without dealing with streams and whatnot.
 */


// Base32-encoded string goes in, decoded data comes out.
function decode(input) {
    var decoder = new Decoder()
    var output = decoder.update(input.split("").reverse().join("")+'A', true)
    return output

}

function toHex(str) {
    var hex = '';
    for(var i=0;i<str.length;i++) {
       //hex += ''+("00" + str.charCodeAt(i).toString(16)).substr(-2);
       hex += str.charCodeAt(i).toString(16);
       }
    return hex;
}

convertHex = toHex(decode('A0C4KB'));
alert(convertHex);
</script>

The above script works fine on FF and Chrome and gives me the correct hex value. The alert output comes as expected with

abc2d0

For IE, this doesn't seem to work. I get all

ffffffff

This is a Base32 implementation that I pickep up from https://github.com/agnoster/base32-js

Upvotes: 1

Views: 127

Answers (1)

Elias Van Ootegem
Elias Van Ootegem

Reputation: 76405

Internet Explorer's JScript engine doesn't support array access to string constants. You'll have to replace alphabet[i] with alphabet.charAt(i) to get it working. I thought MS had addressed this issue, though, but I could be wrong/too hopeful.

Upvotes: 2

Related Questions