A ordem dos bytes em um GUID não é a mesma que a ordem em seu
ToString()
representação em sistemas little-endian. Você deve usar guid.ToByteArray() em vez de usar ToString().
E, você deve usar
new Guid(byte[] b)
para construí-lo, em vez de $str
. Para expressar isso em C# puro:
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.
}
Dê uma olhada na seção "Estrutura básica" do artigo GUID na Wikipédia para mais detalhes.
Você verá que a maioria dos dados é armazenada em "Native" endianness... que é de onde vem a confusão.
Citar:
Editar:
Versão do Powershell:
function base64toguid
{
param($str);
$b = [System.Convert]::FromBase64String($str);
$g = new-object -TypeName System.Guid -ArgumentList (,$b);
return $g;
}
Como uma advertência adicional, você pode, opcionalmente, cortar o "==" do final da sua string, já que é apenas um preenchimento (o que pode ajudar se você estiver tentando economizar espaço).