Что такое эквивалент.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
Другие вопросы по тегам