1221 Stimmen

Wie kann man in JavaScript eine Zeichenkette in Base64 kodieren?

Ich habe ein PHP-Skript, das ein PNG-Bild in einen Base64-String kodieren kann.

Ich möchte das Gleiche mit JavaScript machen. Ich weiß, wie man Dateien öffnet, aber ich bin mir nicht sicher, wie man die Kodierung vornimmt. Ich bin es nicht gewohnt, mit binären Daten zu arbeiten.

15voto

Joe Dyndale Punkte 1075

Im Grunde habe ich nur aufgeräumt der ursprüngliche Code ein bisschen so JSLint beschwert sich nicht mehr so sehr, und ich habe die in den Kommentaren als privat gekennzeichneten Methoden tatsächlich privat gemacht. Ich habe auch zwei Methoden hinzugefügt, die ich in meinem eigenen Projekt benötige, nämlich decodeToHex y encodeFromHex .

Der Code:

var Base64 = (function() {
    "use strict";

    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    var _utf8_encode = function (string) {

        var utftext = "", c, n;

        string = string.replace(/\r\n/g,"\n");

        for (n = 0; n < string.length; n++) {

            c = string.charCodeAt(n);

            if (c < 128) {

                utftext += String.fromCharCode(c);

            } else if((c > 127) && (c < 2048)) {

                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            } else {

                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }
        return utftext;
    };

    var _utf8_decode = function (utftext) {
        var string = "", i = 0, c = 0, c1 = 0, c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {

                string += String.fromCharCode(c);
                i++;

            } else if((c > 191) && (c < 224)) {

                c1 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c1 & 63));
                i += 2;

            } else {

                c1 = utftext.charCodeAt(i+1);
                c2 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63));
                i += 3;
            }
        }
        return string;
    };

    var _hexEncode = function(input) {
        var output = '', i;

        for(i = 0; i < input.length; i++) {
            output += input.charCodeAt(i).toString(16);
        }

        return output;
    };

    var _hexDecode = function(input) {
        var output = '', i;

        if(input.length % 2 > 0) {
            input = '0' + input;
        }

        for(i = 0; i < input.length; i = i + 2) {
            output += String.fromCharCode(parseInt(input.charAt(i) + input.charAt(i + 1), 16));
        }
        return output;
    };

    var encode = function (input) {
        var output = "", chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0;

        input = _utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output += _keyStr.charAt(enc1);
            output += _keyStr.charAt(enc2);
            output += _keyStr.charAt(enc3);
            output += _keyStr.charAt(enc4);
        }
        return output;
    };

    var decode = function (input) {
        var output = "", chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = _keyStr.indexOf(input.charAt(i++));
            enc2 = _keyStr.indexOf(input.charAt(i++));
            enc3 = _keyStr.indexOf(input.charAt(i++));
            enc4 = _keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output += String.fromCharCode(chr1);

            if (enc3 !== 64) {
                output += String.fromCharCode(chr2);
            }
            if (enc4 !== 64) {
                output += String.fromCharCode(chr3);
            }

        }

        return _utf8_decode(output);
    };

    var decodeToHex = function(input) {
        return _hexEncode(decode(input));
    };

    var encodeFromHex = function(input) {
        return encode(_hexDecode(input));
    };

    return {
        'encode': encode,
        'decode': decode,
        'decodeToHex': decodeToHex,
        'encodeFromHex': encodeFromHex
    };
}());

12voto

Kathir Punkte 1147

Bitte beachten Sie, dass dies nicht für rohe Unicode-Strings geeignet ist! Siehe den Abschnitt Unicode aquí .

Syntax für die Kodierung

var encodedData = window.btoa(stringToEncode);

Syntax für die Dekodierung

var decodedData = window.atob(encodedData);

12voto

magikMaker Punkte 3508

Um eine Base64-kodierte String-URL freundlich zu gestalten, könnten Sie in JavaScript etwas wie folgt tun:

// if this is your Base64 encoded string
var str = 'VGhpcyBpcyBhbiBhd2Vzb21lIHNjcmlwdA=='; 

// make URL friendly:
str = str.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, '');

// reverse to original encoding
str = (str + '===').slice(0, str.length + (str.length % 4));
str = str.replace(/-/g, '+').replace(/_/g, '/');

Siehe auch diese Fiddle: http://jsfiddle.net/magikMaker/7bjaT/

11voto

Nijikokun Punkte 1446

Ich habe diese Kodierungs- und Dekodierungsmethoden von Hand umgeschrieben, mit Ausnahme der hexadezimalen in ein modulares Format für plattformübergreifende / Browser-Kompatibilität und auch mit echtem privaten Scoping, und verwendet btoa y atob wenn sie aus Geschwindigkeitsgründen vorhanden sind, anstatt ihre eigene Kodierung zu verwenden:

https://gist.github.com/Nijikokun/5192472

Verwendung:

base64.encode(/* String */);
base64.decode(/* String */);

utf8.encode(/* String */);
utf8.decode(/* String */);

10voto

Oded BD Punkte 2038

2022 Aktualisierung der Veralterungswarnung

Ich habe eine Warnung zur Veralterung auf meinem Vscode gesehen

This function is only provided for compatibility with legacy web platform APIs and should never be used in new code, 
because they use strings to represent binary data and predate the introduction of typed arrays in JavaScript. 
For code running using Node.js APIs, 
converting between base64-encoded strings and binary data should be performed using Buffer.from(str, 'base64') andbuf.toString('base64').

Nach der Suche ein bisschen mehr, fand ich diese Ausgabe, die sagt, es ist nicht veraltet

https://github.com/microsoft/TypeScript/issues/45566

so die Lösung für die Verwerfung Warnung auf Web JS, verwenden window.btoa und die Warnung wird verschwinden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X