L'ordre des octets dans un GUID n'est pas le même que l'ordre dans leur ToString()
représentation sur les systèmes little-endian.
Vous devez utiliser guid.ToByteArray() plutôt que ToString().
Et, vous devez utiliser new Guid(byte[] b)
pour le construire, plutôt que $str
.
Pour exprimer cela en C# pur :
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.
}
Consultez la section section "Basic Structure" de l'article GUID sur Wikipédia pour plus de détails.
Vous verrez que la plupart des données sont stockées dans l'endianité "native"... d'où vient la confusion.
Pour citer :
Modifier :
Version Powershell :
function base64toguid
{
param($str);
$b = [System.Convert]::FromBase64String($str);
$g = new-object -TypeName System.Guid -ArgumentList (,$b);
return $g;
}
Comme mise en garde supplémentaire, vous pouvez éventuellement supprimer le "==" de la fin de votre chaîne, car il ne s'agit que d'un remplissage (ce qui peut aider si vous essayez d'économiser de l'espace).