public static void Main()
for(long value=0; value < 100; value++)
Test(value, 10 + 26 + 26);
Console.Write(Environment.NewLine);
public static void Test(long value, int targetBase, int padding = 8)
var converter = new BaseConverter(value, targetBase);
var result = converter.ToString(padding);
Console.Write("value={0} to base{1} => {2}", value, targetBase, result);
public static void Test(long value, string source, int padding = 8)
var converter = new BaseConverter(value, source);
var result = converter.ToString(padding);
Console.Write("value={0} to base{1} => {2}", value, source, result);
public class BaseConverter
public static readonly string Source_Numeric = "0123456789";
public static readonly string Source_LowerCase = "abcdefghijklmnopqrstuvwxyz";
public static readonly string Source_UpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static readonly string Source_FullRange;
Source_FullRange = string.Concat(Source_Numeric, Source_UpperCase, Source_LowerCase);
public BaseConverter(long value)
: this(value, Source_FullRange)
public BaseConverter(long value, int targetBase)
: this(value, Source_FullRange.Substring(0, targetBase))
if (targetBase > _source.Length)
throw new ArgumentOutOfRangeException("base can't be greater than " + _source.Length);
public BaseConverter(long value, string source)
throw new ArgumentOutOfRangeException("base must be at greater than 1");
if (source.Length > Byte.MaxValue)
throw new ArgumentOutOfRangeException("base can't be longer than " + Byte.MaxValue);
public long Value { get; private set; }
public byte Base { get { return (byte)_source.Length; } }
public override string ToString()
return ToStringInternal();
public string ToString(int paddingLen)
var result = ToStringInternal();
return result.PadLeft(paddingLen, pad);
private string ToStringInternal()
var targetBase = (byte)_source.Length;
var sb = new StringBuilder();
var index = (int)(value % targetBase);
sb.Insert(0, _source[index]);