Ordningen på bytes i en GUID är inte densamma som ordningen i deras ToString()
representation på små-endian-system.
Du bör använda guid.ToByteArray() istället för att använda ToString().
Och du bör använda new Guid(byte[] b)
för att konstruera den, snarare än $str
.
För att uttrycka detta i ren 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.
}
Ta en titt på "Basic Structure"-avsnittet i GUID-artikeln på Wikipedia för mer information.
Du kommer att se att det mesta av data lagras i "native" endianness... vilket är varifrån förvirringen kommer.
För att citera:
Redigera:
Powershell-version:
function base64toguid
{
param($str);
$b = [System.Convert]::FromBase64String($str);
$g = new-object -TypeName System.Guid -ArgumentList (,$b);
return $g;
}
Som en extra varning kan du valfritt trimma "==" av änden av din sträng, eftersom det bara är utfyllnad (vilket kan hjälpa om du försöker spara utrymme).