Редът на байтовете в GUID не е същият като реда в техния ToString()
представяне на системи с малък ред.
Трябва да използвате guid.ToByteArray(), а не ToString().
И трябва да използвате new Guid(byte[] b)
за да го конструирате, а не $str
.
За да изразите това в чист 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.
}
Разгледайте раздела „Основна структура“ на статията за GUID в Wikipedia за повече подробности.
Ще видите, че повечето от данните се съхраняват в "Native" endianness... откъдето идва объркването.
Да цитирам:
Редактиране:
Версия на Powershell:
function base64toguid
{
param($str);
$b = [System.Convert]::FromBase64String($str);
$g = new-object -TypeName System.Guid -ArgumentList (,$b);
return $g;
}
Като допълнително предупреждение, можете по желание да отрежете "==" в края на вашия низ, тъй като той е само подложка (което може да помогне, ако се опитвате да спестите място).