1
    <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>

上記のスクリプトは FF と Chrome で正常に動作し、正しい 16 進数の値が得られます。アラート出力は期待どおりに来ます

abc2d0

IE の場合、これは機能しないようです。私はすべてを取得します

フフフフフ

これは、 https: //github.com/agnoster/base32-js からピックアップした Base32 実装です。

4

1 に答える 1

2

Internet Explorer の JScript エンジンは、文字列定数への配列アクセスをサポートしていません。alphabet[i]機能させるには、に置き換える必要がありますalphabet.charAt(i)。ただし、MS はこの問題に対処したと思っていましたが、間違っているか、期待しすぎている可能性があります。

于 2012-09-17T07:04:40.297 に答える