2

我目前正在使用BouncyCastle 的 .NET 端口,System.Guid并且在使用本机 .NET将大整数转换为 a 时遇到了一些麻烦BigInteger

在某些情况下,我在一个(“源”)应用程序中使用 BouncyCastle 将 a 转换System.GuidOrg.BouncyCastle.Math.BigInteger. 然后将该值保存为格式为的字符串3A2B847A960F0E4A8D49BD62DDB6EB38

然后,在另一个(“目的地”)应用程序中,我将这个保存的字符串值 aBigInteger并尝试将其转换回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可以使这项工作。如果我使用ToByteArrayon the System.Numerics.BigInteger(即使在调整数组大小时,如本问题中所述)它也不起作用,并且我得到的结果与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!

4

2 回答 2

2

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

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

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

var sb = new StringBuilder();

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

这将是一个有趣的比较。

于 2016-02-21T23:12:33.040 回答
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
于 2016-02-22T08:00:03.347 回答