Что такое JavaScript-эквивалент C# HttpServerUtility.UrlTokenDecode?
В JavaScript, как я могу декодировать строку, которая была закодирована в C#, используя HttpServerUtility.UrlTokenEncode
?
Есть некоторые эквиваленты в других языках, но я не могу переписать их в JS. Любая помощь будет оценена.
Это версия Java.
Это версия Objective-C.
Обновить:
C# 's 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 ответа
Мне наконец удалось преобразовать версию Objective-c URLTokenDecode
Jeffery Thomas на JavaScript, и это сработало.
Вот функция:
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:
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;
}
});
Возможно, это противоречит правилам публикации, поскольку это не ответ на вопрос, но я нашел эту страницу, когда искал UrlTokenEncode
метод (не декодировать), поэтому, используя информацию здесь, я сделал следующий метод, который, я надеюсь, поможет кому-то еще:
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);
}
Протестировано и работает с C# HttpServerUtility.UrlTokenEncode
а также HttpServerUtility.UrlTokenEncode
Я предполагаю, что это будет decdeuricomponent:
http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp
Чтобы декодировать строку в кодировке UTF8-base64 в JavaScript:
var str2 = decodeURIComponent(escape(window.atob(b64)));
console.log(str2);
Чтобы закодировать UTF8-JavaScript-строку как таковую в JavaScript:
var str = "äöüÄÖÜçéèñ";
var b64 = window.btoa(unescape(encodeURIComponent(str)))
console.log(b64);
Кажется, UrlTokenDecode немного сложнее.
Лучший способ быть на 100% уверенным - это вызвать UrlTokenDecode на стороне сервера с AJAX, а затем вернуть простую строку в кодировке 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);
}
Прочитайте эту статью в 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="