L'ordine dei byte in un GUID non è lo stesso dell'ordine nel loro ToString()
rappresentazione su sistemi little-endian.
Dovresti usare guid.ToByteArray() invece di usare ToString().
E dovresti usare new Guid(byte[] b)
per costruirlo, invece di $str
.
Per esprimerlo in puro 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.
}
Dai un'occhiata alla sezione "Struttura di base" dell'articolo GUID su Wikipedia per maggiori dettagli.
Vedrai che la maggior parte dei dati è archiviata in endianness "nativo"... da qui viene la confusione.
Per citare:
Modifica:
Versione Powershell:
function base64toguid
{
param($str);
$b = [System.Convert]::FromBase64String($str);
$g = new-object -TypeName System.Guid -ArgumentList (,$b);
return $g;
}
Come ulteriore avvertimento, puoi facoltativamente tagliare il "==" fuori dall'estremità della tua stringa, poiché è solo un riempimento (che può aiutare se stai cercando di risparmiare spazio).