Rækkefølgen af bytes i en GUID er ikke den samme som rækkefølgen i deres ToString()
repræsentation på small-endian systemer.
Du bør bruge guid.ToByteArray() i stedet for at bruge ToString().
Og du bør bruge new Guid(byte[] b)
at konstruere det, i stedet for $str
.
For at udtrykke dette 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.
}
Tag et kig på "Basic Structure"-afsnittet i GUID-artiklen på Wikipedia for flere detaljer.
Du vil se, at de fleste data er gemt i "Native" endianness... hvilket er der, forvirringen kommer fra.
For at citere:
Rediger:
Powershell-version:
function base64toguid
{
param($str);
$b = [System.Convert]::FromBase64String($str);
$g = new-object -TypeName System.Guid -ArgumentList (,$b);
return $g;
}
Som en ekstra advarsel kan du valgfrit trimme "==" af enden af din streng, da det kun er polstring (hvilket kan hjælpe, hvis du forsøger at spare plads).