De volgorde van bytes in een GUID is niet hetzelfde als de volgorde in hun ToString()
weergave op little-endian-systemen.
Gebruik guid.ToByteArray() in plaats van ToString().
En u moet new Guid(byte[] b)
. gebruiken om het te construeren, in plaats van $str
.
Om dit in pure C# uit te drukken:
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.
}
Bekijk de "Basic Structure"-sectie van het GUID-artikel op Wikipedia voor meer details.
U zult zien dat de meeste gegevens worden opgeslagen in "Native" endianness... en dat is waar de verwarring vandaan komt.
Om te citeren:
Bewerken:
Powershell-versie:
function base64toguid
{
param($str);
$b = [System.Convert]::FromBase64String($str);
$g = new-object -TypeName System.Guid -ArgumentList (,$b);
return $g;
}
Als extra waarschuwing kun je desgewenst de "==" van het einde van je tekenreeks afsnijden, omdat het slechts opvulling is (wat kan helpen als je ruimte probeert te besparen).