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

时间:2016-02-21 21:24:49

标签: c# .net-4.5 bouncycastle biginteger system.numerics

我目前正在使用.NET port of BouncyCastle,我在使用原生.NET System.Guid将大整数转换为BigInteger时遇到了一些麻烦。

对于某些情况,我在一个(" source")应用程序中使用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(即使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!

2 个答案:

答案 0 :(得分:1)

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

可能两个实现只是以不同方式存储字节。 Endianess等。

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

var sb = new StringBuilder();

foreach (var b in bytes)
{
    sb.AppendFormat("{0:X2} ", b);
} 
sb.ToString();

这是一个有趣的比较。

答案 1 :(得分:1)

我会完全避免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