什么是 .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的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