using System.Runtime.InteropServices;
using System.Buffers.Text;
public static void Main()
Guid gd = Guid.NewGuid();
Console.WriteLine(gd.ToString());
var gds = BetterToStringFromGuid(gd);
Console.WriteLine(BetterToGuidFromString(gds).ToString());
public static string ToStringFromGuid(Guid guid)
return Convert.ToBase64String(guid.ToByteArray()).Replace("/", "-").Replace("+", "_").Replace("=", string.Empty);
public static string BetterToStringFromGuid(Guid guid)
Span<byte> idBytes = stackalloc byte[16];
Span<byte> base64bytes = stackalloc byte[24];
MemoryMarshal.TryWrite(idBytes, ref guid);
Base64.EncodeToUtf8(idBytes, base64bytes, out _, out _);
Span<char> base64Chars = stackalloc char[24];
for (int i = 0; i < 22; i++)
base64Chars[i] = base64bytes[i] switch
_ => (char)base64bytes[i]
return new string (base64Chars);
public static Guid ToGuidFromString(string formatttedGuid)
var guid = Convert.FromBase64String(formatttedGuid.Replace("-", "/").Replace("_", "+") + "==");
private const char EqualsChar = '=';
public static Guid BetterToGuidFromString(ReadOnlySpan<char> formatttedGuid)
Span<char> base64Chars = stackalloc char[24];
for (int i = 0; i < 22; i++)
base64Chars[i] = formatttedGuid[i] switch
base64Chars[22] = EqualsChar;
base64Chars[23] = EqualsChar;
Span<byte> idBytes = stackalloc byte[16];
Convert.TryFromBase64Chars(base64Chars, idBytes, out _);
return new Guid(idBytes);