AddUserSecrets, RenameByDateTaken and BlurHash
This commit is contained in:
64
BlurHash.Core/Base83.cs
Normal file
64
BlurHash.Core/Base83.cs
Normal file
@ -0,0 +1,64 @@
|
||||
namespace BlurHash;
|
||||
|
||||
/// <summary>
|
||||
/// Contains methods to encode or decode integers to Base83-Strings
|
||||
/// </summary>
|
||||
internal static class Base83
|
||||
{
|
||||
internal const string _Charset = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~";
|
||||
|
||||
private static readonly IReadOnlyDictionary<char, int> _ReverseLookup;
|
||||
|
||||
static Base83()
|
||||
{
|
||||
// Build inverse lookup table for fast decoding
|
||||
Dictionary<char, int> charIndices = new();
|
||||
int index = 0;
|
||||
foreach (char c in _Charset)
|
||||
{
|
||||
charIndices[c] = index;
|
||||
index++;
|
||||
}
|
||||
|
||||
_ReverseLookup = charIndices;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Encodes a number into its Base83-representation
|
||||
/// </summary>
|
||||
/// <param name="number">The number to encode</param>
|
||||
/// <param name="output">The data buffer to put the result data into</param>
|
||||
/// <returns>The Base83-representation of the number</returns>
|
||||
public static void EncodeBase83(this int number, Span<char> output)
|
||||
{
|
||||
int length = output.Length;
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
int digit = number % 83;
|
||||
number /= 83;
|
||||
output[length - i - 1] = _Charset[digit];
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Decodes an <code>IEnumerable</code> of Base83-characters into the integral value it represents
|
||||
/// </summary>
|
||||
/// <param name="base83Data">The characters to decode</param>
|
||||
/// <returns>The decoded value as integer</returns>
|
||||
public static int DecodeBase83(this ReadOnlySpan<char> base83Data)
|
||||
{
|
||||
int result = 0;
|
||||
foreach (char c in base83Data)
|
||||
{
|
||||
if (!_ReverseLookup.TryGetValue(c, out int digit))
|
||||
{
|
||||
throw new ArgumentException("The given string contains invalid characters.", nameof(base83Data));
|
||||
}
|
||||
|
||||
result *= 83;
|
||||
result += digit;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user