Pořadí bajtů v GUID není stejné jako pořadí v jejich ToString()
reprezentace na systémech little-endian.
Měli byste použít guid.ToByteArray() spíše než ToString().
A měli byste použít new Guid(byte[] b)
k jeho konstrukci, spíše než $str
.
Abych to vyjádřil v čistém 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.
}
Podívejte se na část "Základní struktura" v článku GUID na Wikipedii, kde najdete další podrobnosti.
Uvidíte, že většina dat je uložena v "nativní" endianness... z toho pramení zmatek.
Cituji:
Upravit:
Verze Powershell:
function base64toguid
{
param($str);
$b = [System.Convert]::FromBase64String($str);
$g = new-object -TypeName System.Guid -ArgumentList (,$b);
return $g;
}
Jako další upozornění můžete volitelně oříznout "==" z konce řetězce, protože je to pouze výplň (což může pomoci, pokud se snažíte ušetřit místo).