Я не уверен, что Base 64 безопасна для URL, поскольку в индексной таблице есть символ '/' (функция пакета, предоставленная в выбранном ответе, приведет к появлению строк, не безопасных для URL).
Вы можете рассмотреть возможность замены символа '/' на что-то более удобное для URL или использовать другую базу. База 62 сделает это здесь, например.
Вот общий код, который переводит взад и вперед из десятичной в любую числовую базу <= 64 (вероятно, быстрее, чем преобразование в байты и затем использование Convert.ToBase64String ()): </p>
static void Main()
{
Console.WriteLine(Decode("101456890", 10));
Console.WriteLine(Encode(101456890, 62));
Console.WriteLine(Decode("6rhZS", 62));
//Result:
//101456890
//6rhZS
//101456890
}
public static long Decode(string str, int baze)
{
long result = 0;
int place = 1;
for (int i = 0; i < str.Length; ++i)
{
result += Value(str[str.Length - 1 - i]) * place;
place *= baze;
}
return result;
}
public static string Encode(long val, int baze)
{
var buffer = new char[64];
int place = 0;
long q = val;
do
{
buffer[place++] = Symbol(q % baze);
q = q / baze;
}
while (q > 0);
Array.Reverse(buffer, 0, place);
return new string(buffer, 0, place);
}
public static long Value(char c)
{
if (c == '+') return 62;
if (c == '/') return 63;
if (c < '0') throw new ArgumentOutOfRangeException("c");
if (c < ':') return c - '0';
if (c < 'A') throw new ArgumentOutOfRangeException("c");
if (c < '[') return c - 'A' + 10;
if (c < 'a') throw new ArgumentOutOfRangeException("c");
if (c < '{') return c - 'a' + 36;
throw new ArgumentOutOfRangeException("c");
}
public static char Symbol(long i)
{
if (i < 0) throw new ArgumentOutOfRangeException("i");
if (i < 10) return (char)('0' + i);
if (i < 36) return (char)('A' + i - 10);
if (i < 62) return (char)('a' + i - 36);
if (i == 62) return '+';
if (i == 63) return '/';
throw new ArgumentOutOfRangeException("i");
}