1

JavaScriptでは、C# でエンコードされた文字列をどのようにデコードできHttpServerUtility.UrlTokenEncodeますか?

他の言語にも相当するものがありますが、JS で書き直すことはできませんでした。どんな助けでも大歓迎です。

これはJavaバージョンです。

これはObjective-Cバージョンです。

アップデート:

C#URLTokenEncodeは base64 エンコーディングと同じではありません。たとえば、最後の文字は常にパディング文字の数です。そのため、一部の文字を適切に置き換える必要があります。コードの Java および Objective-C バージョンは、どの文字を何に置き換える必要があるかを示しています。

試しdecodeURIComponentましたが、正常にデコードされませんでした。文字列は特定の方法でエンコードされているため、これは理にかなっています。base64ではありません。

たとえば、これは C# のUrlTokenEncode文字列の一部です。

vj4_fv7__7-_Pr6-ff3_Pr6_vz8_________________f____79_vP1_vb3_vz8____________________AAA1

これは、Objective-C/Java メソッドを使用して正しくデコードされたバージョンです。

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

4

4 に答える 4

2

最終的にJeffrey ThomasのObjective-c バージョンをJavaScript に変換することができ、うまくいきました。URLTokenDecode

関数は次のとおりです。

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;
}

AngularJS を使用している場合の $filter は次のとおりです。

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;
        }

});
于 2015-08-18T10:25:29.720 に答える
0

私はそれがdecodeuricomponentになると思います:
http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp

JavaScript で UTF8-base64 でエンコードされた文字列をデコードするには:

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

JavaScript で UTF8-JavaScript-string をそのままエンコードするには:

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

UrlTokenDecode はもう少し複雑なようです。
100% 確実な最善の方法は、AJAX を使用してサーバー側で UrlTokenDecode を呼び出し、base64 でエンコードされた単純な文字列を返すことです。

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);
}

ソース

于 2015-08-18T08:30:45.600 に答える
-1

問題と解決策について説明している MDN の記事を読んでください。

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="
于 2015-08-18T08:30:58.713 に答える