new extension classes
This commit is contained in:
parent
ef349eceb1
commit
0e5c79c01a
@ -0,0 +1,63 @@
|
||||
using System.Buffers.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace EnotaryoPH.Web.Common.Extensions
|
||||
{
|
||||
public static class GuidExtensions
|
||||
{
|
||||
private const char Dash = '-';
|
||||
private const char EqualsChar = '=';
|
||||
private const byte ForwardSlashByte = (byte)'/';
|
||||
private const char Plus = '+';
|
||||
private const byte PlusByte = (byte)'+';
|
||||
private const char Slash = '/';
|
||||
private const char Underscore = '_';
|
||||
|
||||
public static string ToBase64String(this Guid guid)
|
||||
{
|
||||
Span<byte> guidBytes = stackalloc byte[16];
|
||||
Span<byte> encodedBytes = stackalloc byte[24];
|
||||
|
||||
MemoryMarshal.TryWrite(guidBytes, ref guid); // write bytes from the Guid
|
||||
Base64.EncodeToUtf8(guidBytes, encodedBytes, out _, out _);
|
||||
|
||||
Span<char> chars = stackalloc char[22];
|
||||
|
||||
// replace any characters which are not URL safe
|
||||
// skip the final two bytes as these will be '==' padding we don't need
|
||||
for (var i = 0; i < 22; i++)
|
||||
{
|
||||
chars[i] = encodedBytes[i] switch
|
||||
{
|
||||
ForwardSlashByte => Dash,
|
||||
PlusByte => Underscore,
|
||||
_ => (char)encodedBytes[i],
|
||||
};
|
||||
}
|
||||
|
||||
var final = new string(chars);
|
||||
|
||||
return final;
|
||||
}
|
||||
|
||||
public static Guid ToGuidFromString(ReadOnlySpan<char> id)
|
||||
{
|
||||
Span<char> base64Chars = stackalloc char[24];
|
||||
for (var i = 0; i < 22; i++)
|
||||
{
|
||||
base64Chars[i] = id[i] switch
|
||||
{
|
||||
'-' => Slash,
|
||||
'_' => Plus,
|
||||
_ => id[i]
|
||||
};
|
||||
}
|
||||
base64Chars[22] = EqualsChar;
|
||||
base64Chars[23] = EqualsChar;
|
||||
|
||||
Span<byte> idBytes = stackalloc byte[16];
|
||||
Convert.TryFromBase64Chars(base64Chars, idBytes, out _);
|
||||
return new Guid(idBytes);
|
||||
}
|
||||
}
|
||||
}
|
@ -3,5 +3,7 @@
|
||||
public static class StringExtensions
|
||||
{
|
||||
public static string DefaultIfEmpty(this string s, string defaultValue) => !string.IsNullOrWhiteSpace(s) ? s : (defaultValue ?? string.Empty);
|
||||
|
||||
public static string NullIfWhiteSpace(this string s) => string.IsNullOrWhiteSpace(s) ? null : s;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user