Что такое эквивалент.NET System.Numerics.BigInteger для Org.BouncyCastle.Math.BigInteger.ToByteArrayUnsigned?
В настоящее время я работаю с .NET-портом BouncyCastle, и у меня возникли проблемы с преобразованием большого целого числа в System.Guid
используя родной.NET BigInteger
,
Для некоторого контекста я использую BouncyCastle в одном ("исходном") приложении для преобразования System.Guid
к Org.BouncyCastle.Math.BigInteger
, Это значение затем сохраняется в виде строки в формате 3A2B847A960F0E4A8D49BD62DDB6EB38
,
Затем в другом приложении ("назначение") я беру это сохраненное строковое значение BigInteger
и я пытаюсь превратить его обратно в System.Guid
,
Обратите внимание, что в целевом приложении я не хочу использовать BouncyCastle в качестве ссылки и хотел бы использовать базовые библиотеки.NET для преобразования. Однако, поскольку я сталкиваюсь с проблемами при конвертации с базовыми классами.NET, я использую BouncyCastle, и следующий код делает именно то, что я хотел:
var data = "3A2B847A960F0E4A8D49BD62DDB6EB38";
var integer = new Org.BouncyCastle.Math.BigInteger( data, 16 );
var bytes = integer.ToByteArrayUnsigned();
var guid = new Guid( bytes ); // holds expected value: (7A842B3A-0F96-4A0E-8D49-BD62DDB6EB38)
Как видите, есть ToByteArrayUnsigned
метод на Org.BouncyCastle.Math.BigInteger
это делает эту работу. Если я использую ToByteArray
на System.Numerics.BigInteger
(даже при изменении размера массива, как обсуждалось в этом вопросе), он не работает, и я получаю другое System.Guid
чем ожидалось.
Итак, каков наилучший способ выполнить эквивалентную операцию, используя родные классы.NET?
Решение
Благодаря предложению @John-Tasler выясняется, что это произошло из-за порядочности... чертовски бессмысленно... кончится ли ваша бесконечность?:П
var parsed = System.Numerics.BigInteger.Parse( "3A2B847A960F0E4A8D49BD62DDB6EB38", NumberStyles.HexNumber ).ToByteArray();
Array.Resize( ref parsed, 16 );
var guid = new Guid( parsed.Reverse().ToArray() ); // Hoorrrrayyyy!
2 ответа
Каково реальное значение результирующего Guid при использовании BigIntegrer.NET?
Возможно, что две реализации просто хранят байты по-разному. Endianess и т. Д.
Чтобы увидеть, что возвращается из массива байтов каждой реализации:
var sb = new StringBuilder();
foreach (var b in bytes)
{
sb.AppendFormat("{0:X2} ", b);
}
sb.ToString();
Это было бы интересное сравнение.
Я бы избежал BigInteger
здесь целиком Ваш data
байты уже в правильном порядке, поэтому вы можете преобразовать в byte[]
непосредственно.
var data = "3A2B847A960F0E4A8D49BD62DDB6EB38";
var bytes = new byte[16];
for (var i = 0; i < 16; i++)
bytes[i] = byte.Parse(data.Substring(i * 2, 2), NumberStyles.HexNumber);
var guid = new Guid(bytes); // 7a842b3a-0f96-4a0e-8d49-bd62ddb6eb38