什么是 .NET System.Numerics.BigInteger 相当于 Org.BouncyCastle.Mat

本文关键字:相当于 Org BouncyCastle Mat BigInteger Numerics NET System 什么 | 更新日期: 2023-09-27 18:35:33

我目前正在使用BouncyCastle的.NET端口,在使用本机.NET BigInteger将大整数转换为System.Guid时遇到一些问题。

在某些情况下,我在一个("源")应用程序中使用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)

如您所见,Org.BouncyCastle.Math.BigInteger上有一个ToByteArrayUnsigned方法可以使它工作。 如果我在System.Numerics.BigInteger上使用ToByteArray(即使按照此问题中所述调整数组大小),它不起作用,并且我得到的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 System.Numerics.BigInteger 相当于 Org.BouncyCastle.Mat

使用 .NET的BigIntegrer?

可能是这两个实现只是以不同的方式存储字节。恩迪亚等

要查看从每个实现的字节数组返回的内容,请执行以下操作:

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