我目前正在使用.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!
答案 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