Org.BouncyCastle.Math.BigInteger.ToByteArrayUnsigned 的 .NET System.Numerics.BigInteger 等价物是什么?

What is the .NET System.Numerics.BigInteger Equivalent of Org.BouncyCastle.Math.BigInteger.ToByteArrayUnsigned?

我目前正在使用 .NET port of BouncyCastle,但在使用本机 .NET BigInteger.

将大整数转换为 System.Guid 时遇到了一些问题

对于某些上下文,我在一个 ("source") 应用程序中使用 BouncyCastle 将 System.Guid 转换为 Org.BouncyCastle.Math.BigInteger。然后将该值保存为 3A2B847A960F0E4A8D49BD62DDB6EB38.

格式的字符串

然后,在另一个 ("destination") 应用程序中,我正在使用 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)

如您所见,Org.BouncyCastle.Math.BigInteger 上有一个 ToByteArrayUnsigned 方法可以实现此功能。如果我在 System.Numerics.BigInteger 上使用 ToByteArray(即使在 resizing the array as discussed in this question 时)它也不起作用并且我得到与预期不同的 System.Guid

那么,使用本机 .NET 执行与上述操作等效的最佳方法是什么 类?

解决方案

多亏了@John-Tasler 的建议,事实证明这是由于字节序...该死的字节序...您的字节序会永远结束吗? :P

var parsed = System.Numerics.BigInteger.Parse( "3A2B847A960F0E4A8D49BD62DDB6EB38", NumberStyles.HexNumber ).ToByteArray(); Array.Resize( ref parsed, 16 ); var guid = new Guid( parsed.Reverse().ToArray() ); // Hoorrrrayyyy!

使用 .NET 的 BigIntegrer 时生成的 Guid 的实际值是多少?

可能这两种实现只是以不同方式存储字节。字节顺序等

查看每个实现的字节数组返回的内容:

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