Wie kann ich in JavaScript eine Zeichenfolge dekodieren, die in C # mit HttpServerUtility.UrlTokenEncode codiert wurde?

Es gibt einige Entsprechungen in anderen Sprachen, aber ich konnte sie nicht in JS umschreiben. Jede Hilfe wäre dankbar.

Dies ist die Java Version.

Dies ist die Objective-C Version.

Aktualisieren:

C {'s URLTokenEncode ist nicht dasselbe wie die Base64-Codierung. Zum Beispiel ist das letzte Zeichen immer die Anzahl der Füllzeichen. Daher müssen einige Zeichen ordnungsgemäß ersetzt werden. Java- und Objective-C-Version des Codes zeigen, welche Zeichen durch welche ersetzt werden müssen.

Ich habe decodeURIComponent ausprobiert, aber es wurde nicht erfolgreich dekodiert. Dies ist sinnvoll, da die Zeichenfolge mit einer bestimmten Methode codiert wird. Es ist nicht base64.

Dies ist beispielsweise nur ein Teil der UrlTokenEncode Zeichenfolge eines C #:

vj4_fv7__7-_Pr6-ff3_Pr6_vz8_________________f____79_vP1_vb3_vz8____________________AAA1

Und dies ist die richtige dekodierte Version mit der Objective-C / Java-Methode:

vj4/fv7//7+/Pr6+ff3/Pr6/vz8/////////////////f////79/vP1/vb3/vz8////////////////////AAA=

1
Sobhan 18 Aug. 2015 im 11:18

4 Antworten

Beste Antwort

Ich habe es endlich geschafft, die Objective-c-Version von URLTokenDecode durch Jeffrey Thomas auf JavaScript und es hat funktioniert.

Hier ist die Funktion:

function URLTokenDecode(token) {

    if (token.length == 0) return null;

    // The last character in the token is the number of padding characters.
    var numberOfPaddingCharacters = token.slice(-1);

    // The Base64 string is the token without the last character.
    token = token.slice(0, -1);

    // '-'s are '+'s and '_'s are '/'s.
    token = token.replace(/-/g, '+');
    token = token.replace(/_/g, '/');

    // Pad the Base64 string out with '='s
    for (var i = 0; i < numberOfPaddingCharacters; i++)
        token += "=";

    return token;
}

Hier ist der $ -Filter, wenn Sie AngularJS verwenden:

app.filter('URLTokenDecode', function () {
        return function (token) {

            if (token.length == 0) return null;

            // The last character in the token is the number of padding characters.
            var numberOfPaddingCharacters = token.slice(-1);

            // The Base64 string is the token without the last character.
            token = token.slice(0, -1);

            // '-'s are '+'s and '_'s are '/'s.
            token = token.replace(/-/g, '+');
            token = token.replace(/_/g, '/');

            // Pad the Base64 string out with '='s
            for (var i = 0; i < numberOfPaddingCharacters; i++)
                token += "=";

            return token;
        }

});
1
Community 23 Mai 2017 im 12:29

Ich denke, das wäre eine decodeurische Komponente:
http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp

So dekodieren Sie eine UTF8-base64-codierte Zeichenfolge in JavaScript:

var str2 = decodeURIComponent(escape(window.atob(b64)));
console.log(str2);

So codieren Sie eine UTF8-JavaScript-Zeichenfolge als solche in JavaScript:

var str = "äöüÄÖÜçéèñ";
var b64 = window.btoa(unescape(encodeURIComponent(str)))
console.log(b64);

UrlTokenDecode scheint etwas komplizierter zu sein.
Die beste Methode, um 100% sicher zu sein, besteht darin, UrlTokenDecode auf der Serverseite mit AJAX aufzurufen und dann eine einfache Base64-codierte Zeichenfolge zurückzugeben.

public static byte[] UrlTokenDecode (string input)
{
    if (input == null)
        throw new ArgumentNullException ("input");
    if (input.Length < 1)
        return new byte[0];
    byte[] bytes = Encoding.ASCII.GetBytes (input);
    int inputLength = input.Length - 1;
    int equalsCount = (int)(((char)bytes[inputLength]) - 0x30);
    char[] ret = new char[inputLength + equalsCount];
    int i = 0;
    for (; i < inputLength; i++) {
        switch ((char)bytes[i]) {
            case '-':
                ret[i] = '+';
                break;

            case '_':
                ret[i] = '/';
                break;

            default:
                ret[i] = (char)bytes[i];
                break;
        }
    }
    while (equalsCount > 0) {
        ret[i++] = '=';
        equalsCount--;
    }

    return Convert.FromBase64CharArray (ret, 0, ret.Length);
}

Quelle

0
Stefan Steiger 18 Aug. 2015 im 13:30

Lesen Sie diesen Artikel in MDN, der das Problem und die Lösung beschreibt:

https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding

function b64EncodeUnicode(str) {
    return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
        return String.fromCharCode('0x' + p1);
    }));
}

b64EncodeUnicode('✓ à la mode'); // "4pyTIMOgIGxhIG1vZGU="
-1
MoLow 18 Aug. 2015 im 08:30

Dies verstößt möglicherweise gegen die Veröffentlichungsregeln, da es keine Antwort auf die Frage ist. Ich habe diese Seite gefunden, als ich nach der UrlTokenEncode -Methode gesucht (nicht dekodiert) habe. Mit den Informationen hier habe ich die folgende Methode erstellt, von der ich hoffe, dass sie jemandem hilft sonst raus:

function urlTokenEncode(str) {
    var b64 = btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
            function(match, t) {
                return String.fromCharCode('0x' + t);
            })),
        padChars = b64.match(/=/g);
    return b64.replace(/=/g, "") + (padChars == null ? 0 : padChars.length);
}

Getestet und mit C # HttpServerUtility.UrlTokenEncode und HttpServerUtility.UrlTokenEncode gearbeitet

0
Jimbo 8 Sept. 2017 im 12:53