using System.Text;
namespace StellaOps.Graph.Indexer.Schema;
///
/// Base32 encoder using the Crockford alphabet (0-9A-HJKMNPQRSTVWXYZ).
///
internal static class Base32Crockford
{
private const string Alphabet = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
public static string Encode(ReadOnlySpan data)
{
if (data.IsEmpty)
{
return string.Empty;
}
var output = new StringBuilder((data.Length * 8 + 4) / 5);
var buffer = 0;
var bitsLeft = 0;
foreach (var b in data)
{
buffer = (buffer << 8) | b;
bitsLeft += 8;
while (bitsLeft >= 5)
{
bitsLeft -= 5;
var index = (buffer >> bitsLeft) & 0x1F;
output.Append(Alphabet[index]);
}
}
if (bitsLeft > 0)
{
var index = (buffer << (5 - bitsLeft)) & 0x1F;
output.Append(Alphabet[index]);
}
return output.ToString();
}
}