Gordon Pedersen
7c84fbc4c5
There's a lot of rubbish in here, but I don't want to lose anything, so I'm going to commit it all before getting rid of some of the trash.
43 lines
1.3 KiB
C#
43 lines
1.3 KiB
C#
namespace ActivityPub.Utils;
|
|
|
|
// https://stackoverflow.com/a/35004409
|
|
public class Base36
|
|
{
|
|
private static readonly char[] BaseChars =
|
|
"0123456789abcdefghijklmnopqrstuvwxyz".ToCharArray();
|
|
private static readonly Dictionary<char, int> CharValues = BaseChars
|
|
.Select((c, i) => new { Char = c, Index = i })
|
|
.ToDictionary(c => c.Char, c => c.Index);
|
|
|
|
public static string ToString(long value)
|
|
{
|
|
long targetBase = BaseChars.Length;
|
|
// Determine exact number of characters to use.
|
|
char[] buffer = new char[Math.Max(
|
|
(int)Math.Ceiling(Math.Log(value + 1, targetBase)), 1)];
|
|
|
|
var i = buffer.Length;
|
|
do
|
|
{
|
|
buffer[--i] = BaseChars[value % targetBase];
|
|
value = value / targetBase;
|
|
}
|
|
while (value > 0);
|
|
|
|
return new string(buffer, i, buffer.Length - i);
|
|
}
|
|
|
|
public static long FromString(string number)
|
|
{
|
|
char[] chrs = number.ToLower().ToCharArray();
|
|
int m = chrs.Length - 1;
|
|
int n = BaseChars.Length, x;
|
|
long result = 0;
|
|
for (int i = 0; i < chrs.Length; i++)
|
|
{
|
|
x = CharValues[chrs[i]];
|
|
result += x * (long)Math.Pow(n, m--);
|
|
}
|
|
return result;
|
|
}
|
|
}
|