using System.Diagnostics;
using System.Collections.Generic;
public static void Main() {
for (int i = 0; i < 10000; i++) {
var rndBase = r.Next(2, 62);
var encoded = NumberToBase(i, rndBase);
var decoded = NumberFromBase(encoded, rndBase);
Console.WriteLine("i: {0} enc: {1} dec: {2}", i, encoded, decoded);
Console.WriteLine("Completed no errors");
private const string BASE_DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
public static string NumberToBase(long number, int toBase) {
Debug.Assert(toBase >= 2 && toBase <= BASE_DIGITS.Length);
if (number == 0) return "0";
if (number < 0) throw new ArgumentOutOfRangeException("number", number, "Number cannot be negative");
var baseChars = BASE_DIGITS.ToCharArray();
var result = new Stack<char>();
result.Push(baseChars[number % toBase]);
return new string (result.ToArray());
public static long NumberFromBase(string number, int fromBase) {
Debug.Assert(fromBase >= 2 && fromBase <= BASE_DIGITS.Length);
for (var i = number.Length - 1; i >= 0; i--) {
result += BASE_DIGITS.IndexOf(number[i]) * multiplier;