Kolejność bajtów w identyfikatorze GUID nie jest taka sama jak kolejność w ich ToString()
reprezentacja w systemach little-endian.
Powinieneś używać guid.ToByteArray() zamiast ToString().
I powinieneś użyć new Guid(byte[] b)
aby go skonstruować, a nie $str
.
Aby wyrazić to w czystym C#:
public string GuidToBase64(Guid guid)
{
return System.Convert.ToBase64String(guid.ToByteArray()); // Very similar to what you have.
}
public Guid Base64Toguid(string base64)
{
var bytes = System.Convert.FromBase64String(base64);
return new Guid(bytes); // Not that I'm not building up a string to represent the GUID.
}
Zajrzyj do sekcji „Struktura podstawowa” w artykule GUID na Wikipedii, aby uzyskać więcej informacji.
Zobaczysz, że większość danych jest przechowywana w „natywnej” endianowości… skąd bierze się zamieszanie.
Cytując:
Edytuj:
Wersja Powershell:
function base64toguid
{
param($str);
$b = [System.Convert]::FromBase64String($str);
$g = new-object -TypeName System.Guid -ArgumentList (,$b);
return $g;
}
Jako dodatkowe zastrzeżenie możesz opcjonalnie przyciąć "==" z końca ciągu, ponieważ jest to tylko dopełnienie (co może pomóc, jeśli próbujesz zaoszczędzić miejsce).